RPA Toolkit
work on bitmap operations
authorMartin Stoilov <martin@rpasearch.com>
Tue, 19 Jul 2011 05:49:43 +0000 (22:49 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Wed, 20 Jul 2011 05:34:53 +0000 (22:34 -0700)
20 files changed:
rgrep/unix/main.c
rgrep/win32/main.c
rpa/rpabitmap.c
rpa/rpabitmap.h
rpa/rpacompiler.c
rpa/rpacompiler.h
rpa/rpadbex.c
rpa/rpadbex.h
rpa/rpadbexpriv.h
rpa/rpaparser.c
rpa/rpastat.c
rpa/rpavm.c
rpa/rpavm.h
tests/datapatterns/xml.rpa
tests/testrpa/rpacompiler-altexp.c
tests/testrpa/rpacompiler-rule.c
tests/testrpa/rpacompiler-rulealtrec.c
tests/testrpa/rpacompiler-ruleloop.c
tests/testrpa/rpacompiler-ruleloopcls.c
tests/testrpa/rpacompiler-rulerec.c

index c3604dc..9f6d777 100644 (file)
@@ -63,7 +63,8 @@ int usage(int argc, const char *argv[])
                fprintf(stderr, "\t    --dump-records       Display rules parsing records.\n");
                fprintf(stderr, "\t    --no-optimizations   Disable optimizations.\n");
                fprintf(stderr, "\t    --exec-debug         Execute in debug mode.\n");
-               fprintf(stderr, "\t    --dissable-cache     Dissable execution cache.\n");
+               fprintf(stderr, "\t    --no-cache           Disable execution cache.\n");
+               fprintf(stderr, "\t    --no-bitmap          Disable expression bitmap use.\n");
                
                return 0;
 }
@@ -104,6 +105,12 @@ int main(int argc, const char *argv[])
        }
 
        for (i = 1; i < argc; i++) {
+               if (strcmp(argv[i], "--no-bitmap") == 0) {
+                       rpa_dbex_cfgset(pGrep->hDbex, RPA_DBEXCFG_BITMAP, 0);
+               }
+       }
+
+       for (i = 1; i < argc; i++) {
                if (strcmp(argv[i], "--no-optimizations") == 0) {
                        rpa_grep_optimizations(pGrep, 0);
                }
@@ -140,6 +147,18 @@ int main(int argc, const char *argv[])
        }
 
        for (i = 1; i < argc; i++) {
+               if (strcmp(argv[i], "--exec-debug") == 0) {
+                       pGrep->execdebug = 1;
+               }
+       }
+
+       for (i = 1; i < argc; i++) {
+               if (strcmp(argv[i], "--no-cache") == 0) {
+                       pGrep->disablecache = 1;
+               }
+       }
+
+       for (i = 1; i < argc; i++) {
                if (strcmp(argv[i], "--dump-code") == 0) {
                        if (rpa_dbex_compile(pGrep->hDbex) == 0) {
                                if (++i < argc) {
@@ -165,7 +184,6 @@ int main(int argc, const char *argv[])
                }
        }
 
-
        for (i = 1; i < argc; i++) {
                if (strcmp(argv[i], "--dump-alias") == 0) {
                        rpa_grep_dump_alias_info(pGrep);
@@ -180,19 +198,6 @@ int main(int argc, const char *argv[])
                }
        }
 
-       for (i = 1; i < argc; i++) {
-               if (strcmp(argv[i], "--exec-debug") == 0) {
-                       pGrep->execdebug = 1;
-               }
-       }
-
-       for (i = 1; i < argc; i++) {
-               if (strcmp(argv[i], "--dissable-cache") == 0) {
-                       pGrep->disablecache = 1;
-               }
-       }
-
-
        if (rpa_dbex_compile(pGrep->hDbex) < 0) {
                rpa_errinfo_t errinfo;
                rpa_dbex_lasterrorinfo(pGrep->hDbex, &errinfo);
index 7e4cc07..0973adb 100644 (file)
@@ -57,8 +57,9 @@ int usage(int argc, const wchar_t *argv[])
                fwprintf(stderr, L"\t    --dump-records       Display rules parsing records.\n");
                fwprintf(stderr, L"\t    --no-optimizations   Disable optimizations.\n");
                fwprintf(stderr, L"\t    --exec-debug         Execute in debug mode.\n");
-               fwprintf(stderr, L"\t    --dissable-cache     Dissable execution cache.\n");
-       
+               fwprintf(stderr, L"\t    --no-cache           Disable execution cache.\n");
+               fwprintf(stderr, L"\t    --no-bitmap          Disable expression bitmap use.\n");
+
                return 0;
 }
 
@@ -91,6 +92,19 @@ int wmain(int argc, const wchar_t* argv[])
                        goto end;
                }
        }
+
+       for (i = 1; i < argc; i++) {
+               if (wcscmp(argv[i], L"--no-bitmap") == 0) {
+                       rpa_dbex_cfgset(pGrep->hDbex, RPA_DBEXCFG_BITMAP, 0);
+               }
+       }
+
+       for (i = 1; i < argc; i++) {
+               if (wstrcmp(argv[i], L"--no-optimizations") == 0) {
+                       rpa_grep_optimizations(pGrep, 0);
+               }
+       }
+
        for (i = 1; i < argc; i++) {
                if (wcscmp(argv[i], L"-c") == 0) {
                        if (++i < argc) {
@@ -164,7 +178,6 @@ int wmain(int argc, const wchar_t* argv[])
                }
        }
 
-
        for (i = 1; i < argc; i++) {
                if (wcscmp(argv[i], L"--dump-alias") == 0) {
                        rpa_grep_dump_alias_info(pGrep);
@@ -186,7 +199,7 @@ int wmain(int argc, const wchar_t* argv[])
        }
 
        for (i = 1; i < argc; i++) {
-               if (wcscmp(argv[i], L"--dissable-cache") == 0) {
+               if (wcscmp(argv[i], L"--no-cache") == 0) {
                        pGrep->disablecache = 1;
                }
        }
index f7ec3a5..af5dbc4 100644 (file)
 
 static long rpa_bitmap_set(rarray_t *records, long rec, rpointer userdata);
 
+static long rpa_bitmap_set_startrec(rarray_t *records, long rec, rpabitmap_t bitmap)
+{
+       rparecord_t *record = rpa_record_get(records, rpa_recordtree_get(records, rec, RPA_RECORD_START));
+       record->userdata = bitmap;
+
+       return 0;
+}
+
 
 void rpa_dbex_buildbitmapinfo_for_rule(rpadbex_t *dbex, rparule_t rid)
 {
@@ -38,7 +46,7 @@ void rpa_dbex_buildbitmapinfo_for_rule(rpadbex_t *dbex, rparule_t rid)
        bc.dbex = dbex;
        if ((info = (rpa_ruleinfo_t *)r_harray_get(rules, rid)) != NULL) {
                rparecord_t *record = rpa_record_get(dbex->records, info->startrec);
-               RPA_BITMAP_SETALL(record);
+               RPA_BITMAP_SETALL(RPA_RECORD2BITMAP(record));
                rpa_recordtree_walk(dbex->records, info->startrec, 0, rpa_bitmap_set, (rpointer)&bc);
        }
 
@@ -54,10 +62,10 @@ rword rpa_dbex_getrulebitmap(rpadbex_t *dbex, rparule_t rid)
        if ((info = (rpa_ruleinfo_t *)r_harray_get(rules, rid)) != NULL) {
                rparecord_t *record = rpa_record_get(dbex->records, info->startrec);
                if (record) {
-                       if (!record->userdata) {
+                       if (!RPA_BITMAP_GETVAL(RPA_RECORD2BITMAP(record))) {
                                rpa_dbex_buildbitmapinfo_for_rule(dbex, rid);
                        }
-                       bitmap = record->userdata;
+                       bitmap = RPA_BITMAP_GETVAL(RPA_RECORD2BITMAP(record));
                }
        }
        return bitmap;
@@ -87,7 +95,7 @@ static long rpa_bitmap_set_char(rarray_t *records, rparecord_t *record, long rec
                return -1;
        }
 
-       RPA_BITMAP_SETBIT(record, wc % RPA_BITMAP_BITS);
+       RPA_BITMAP_SETBIT(RPA_RECORD2BITMAP(record), wc % RPA_BITMAP_BITS);
        return 0;
 }
 
@@ -109,10 +117,8 @@ static long rpa_bitmap_set_range(rarray_t *records, rparecord_t *record, long re
                        wc1 = bc->endchar;
                }
                for (wc = wc1; wc <= wc2 && (wc - wc1) < RPA_BITMAP_BITS; wc++) {
-                       RPA_BITMAP_SETBIT(record, (wc % RPA_BITMAP_BITS));
+                       RPA_BITMAP_SETBIT(RPA_RECORD2BITMAP(record), (wc % RPA_BITMAP_BITS));
                }
-
-
        }
        return 0;
 }
@@ -167,7 +173,7 @@ static long rpa_bitmap_set_clschar(rarray_t *records, rparecord_t *record, long
                         */
                        return -1;
                }
-               RPA_BITMAP_SETBIT(record, wc % RPA_BITMAP_BITS);
+               RPA_BITMAP_SETBIT(RPA_RECORD2BITMAP(record), wc % RPA_BITMAP_BITS);
        }
        return 0;
 }
@@ -180,7 +186,7 @@ static long rpa_bitmap_set_cls(rarray_t *records, rparecord_t *record, long rec,
 
                for (child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END); child >= 0; child = rpa_recordtree_next(records, child, RPA_RECORD_END)) {
                        rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_ORBITS(record, childrecord);
+                       RPA_BITMAP_ORBITS(RPA_RECORD2BITMAP(record), RPA_RECORD2BITMAP(childrecord));
                }
                return 0;
 
@@ -192,20 +198,15 @@ static long rpa_bitmap_set_cls(rarray_t *records, rparecord_t *record, long rec,
 static long rpa_bitmap_set_namedrule(rarray_t *records, rparecord_t *record, long rec, rpointer userdata)
 {
        if (record->type & RPA_RECORD_END) {
-               rparecord_t *startrecord;
                long child;
                child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END);
 
                for (child = rpa_recordtree_next(records, child, RPA_RECORD_END); child >= 0; child = rpa_recordtree_next(records, child, RPA_RECORD_END)) {
                        rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_ORBITS(record, childrecord);
+                       RPA_BITMAP_ORBITS(RPA_RECORD2BITMAP(record), RPA_RECORD2BITMAP(childrecord));
                        if (!(childrecord->usertype & RPA_MATCH_OPTIONAL))
                                break;
                }
-               startrecord = rpa_record_get(records, rpa_recordtree_get(records, rec, RPA_RECORD_START));
-               if (startrecord)
-                       startrecord->userdata = record->userdata;
-               return 0;
        }
        return 0;
 }
@@ -218,7 +219,7 @@ static long rpa_bitmap_set_expression(rarray_t *records, rparecord_t *record, lo
 
                for (child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END); child >= 0; child = rpa_recordtree_next(records, child, RPA_RECORD_END)) {
                        rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_ORBITS(record, childrecord);
+                       RPA_BITMAP_ORBITS(RPA_RECORD2BITMAP(record), RPA_RECORD2BITMAP(childrecord));
                        if (!(childrecord->usertype & RPA_MATCH_OPTIONAL))
                                break;
                }
@@ -236,7 +237,7 @@ static long rpa_bitmap_set_orop(rarray_t *records, rparecord_t *record, long rec
 
                for (child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END); child >= 0; child = rpa_recordtree_next(records, child, RPA_RECORD_END)) {
                        rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_ORBITS(record, childrecord);
+                       RPA_BITMAP_ORBITS(RPA_RECORD2BITMAP(record), RPA_RECORD2BITMAP(childrecord));
                }
                return 0;
 
@@ -253,7 +254,7 @@ static long rpa_bitmap_set_minop(rarray_t *records, rparecord_t *record, long re
                child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END);
                if (child >= 0) {
                        rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_SETVAL(record, RPA_BITMAP_GETVAL(childrecord));
+                       RPA_BITMAP_SETVAL(RPA_RECORD2BITMAP(record), RPA_BITMAP_GETVAL(RPA_RECORD2BITMAP(childrecord)));
                }
                return 0;
 
@@ -275,9 +276,9 @@ static long rpa_bitmap_set_specialchar(rarray_t *records, rparecord_t *record, l
        wc = rpa_special_char(wc);
 
        if (wc == '.') {
-               RPA_BITMAP_SETALL(record);
+               RPA_BITMAP_SETALL(RPA_RECORD2BITMAP(record));
        } else {
-               RPA_BITMAP_SETBIT(record, wc % RPA_BITMAP_BITS);
+               RPA_BITMAP_SETBIT(RPA_RECORD2BITMAP(record), wc % RPA_BITMAP_BITS);
        }
        return 0;
 }
@@ -289,7 +290,7 @@ static long rpa_bitmap_set_clsnum(rarray_t *records, rparecord_t *record, long r
                long child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END);
                if (child >= 0) {
                        rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_SETBIT(record, childrecord->userdata % RPA_BITMAP_BITS);
+                       RPA_BITMAP_SETBIT(RPA_RECORD2BITMAP(record), childrecord->userdata % RPA_BITMAP_BITS);
                }
        }
        return 0;
@@ -313,7 +314,7 @@ static long rpa_bitmap_set_numrng(rarray_t *records, rparecord_t *record, long r
                                wc1 = secondrecord->userdata;
                        }
                        for (wc = wc1; wc <= wc2 && (wc - wc1) < RPA_BITMAP_BITS; wc++) {
-                               RPA_BITMAP_SETBIT(record, (wc % RPA_BITMAP_BITS));
+                               RPA_BITMAP_SETBIT(RPA_RECORD2BITMAP(record), (wc % RPA_BITMAP_BITS));
                        }
                }
        }
@@ -330,7 +331,7 @@ static long rpa_bitmap_set_ref(rarray_t *records, rparecord_t *record, long rec,
                        rparecord_t *childrecord = rpa_record_get(records, child);
                        rparule_t rid = rpa_dbex_lookup(bc->dbex, childrecord->input, childrecord->inputsiz);
                        if (rid >= 0) {
-                               record->userdata = rpa_dbex_getrulebitmap(bc->dbex, rid);
+                               RPA_BITMAP_SETVAL(RPA_RECORD2BITMAP(record), rpa_dbex_getrulebitmap(bc->dbex, rid));
                        }
 
                }
@@ -354,8 +355,7 @@ static long rpa_bitmap_set_notop(rarray_t *records, rparecord_t *record, long re
        if (record->type & RPA_RECORD_END) {
                long child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END);
                if (child >= 0) {
-                       rparecord_t *childrecord = rpa_record_get(records, child);
-                       RPA_BITMAP_SETVAL(record, ~RPA_BITMAP_GETVAL(childrecord));
+                       RPA_BITMAP_SETALL(RPA_RECORD2BITMAP(record));
                }
        }
        return 0;
@@ -428,5 +428,8 @@ static long rpa_bitmap_set(rarray_t *records, long rec, rpointer userdata)
                break;
        };
 
+       if (record->type & RPA_RECORD_END) {
+               rpa_bitmap_set_startrec(records, rec, RPA_BITMAP_GETVAL(RPA_RECORD2BITMAP(record)));
+       }
        return 0;
 }
index 68eee6b..789e526 100644 (file)
@@ -32,17 +32,28 @@ extern "C" {
 
 typedef rword rpabitmap_t;
 
-#define RPA_BITMAP_SIZE (sizeof(rword))
-#define RPA_BITMAP_BITS (RPA_BITMAP_SIZE*8)
-#define RPA_BITMAP_SETBIT(__r__, __b__) do { (__r__)->userdata |= ((rword)1) << (__b__); } while (0)
-#define RPA_BITMAP_GETBIT(__r__, __b__) ((__r__)->userdata & (((rword)1) << (__b__)) ? 1 : 0)
-#define RPA_BITMAP_CLRBIT(__r__, __b__) do { (__r__)->userdata &= ~(((rword)1) << (__b__)); } while (0)
-#define RPA_BITMAP_CLRALL(__r__) do { (__r__)->userdata = (rword)0; } while (0)
-#define RPA_BITMAP_SETALL(__r__) do { (__r__)->userdata = (rword)-1; } while (0)
-#define RPA_BITMAP_ORBITS(__r__, __c__) do { (__r__)->userdata |= (__c__)->userdata; } while (0)
-#define RPA_BITMAP_SETVAL(__r__, __v__) do { (__r__)->userdata = __v__; } while (0)
-#define RPA_BITMAP_GETVAL(__r__) ((__r__)->userdata)
-#define RPA_BMAP_GETBIT(__bitmap__, __bit__) ((__bitmap__) & (((rpabitmap_t)1) << (__bit__)) ? 1 : 0)
+#define RPA_BITMAP_SIZE (sizeof(rpabitmap_t))
+#define RPA_BITMAP_BITS (RPA_BITMAP_SIZE * 8)
+#define RPA_RECORD2BITMAP(__r__) (&(__r__)->userdata)
+#define RPA_BITMAP_SETBIT(__pbmp__, __b__) do { *(__pbmp__) |= ((rpabitmap_t)1) << (__b__); } while (0)
+#define RPA_BITMAP_GETBIT(__pbmp__, __b__) (*(__pbmp__) & (((rpabitmap_t)1) << (__b__)) ? 1 : 0)
+#define RPA_BITMAP_CLRBIT(__pbmp__, __b__) do { *(__pbmp__) &= ~(((rpabitmap_t)1) << (__b__)); } while (0)
+#define RPA_BITMAP_CLRALL(__pbmp__) do { *(__pbmp__) = (rpabitmap_t)0; } while (0)
+#define RPA_BITMAP_SETALL(__pbmp__) do { *(__pbmp__) = (rpabitmap_t)-1; } while (0)
+#define RPA_BITMAP_ORBITS(__pbmp1__, __pbmp2__) do { *(__pbmp1__) |= *(__pbmp2__); } while (0)
+#define RPA_BITMAP_SETVAL(__pbmp__, __v__) do { *(__pbmp__) = __v__; } while (0)
+#define RPA_BITMAP_GETVAL(__pbmp__) *(__pbmp__)
+
+
+//#define RPA_BITMAP_SETBIT(__r__, __b__) do { (__r__)->userdata |= ((rword)1) << (__b__); } while (0)
+//#define RPA_BITMAP_GETBIT(__r__, __b__) ((__r__)->userdata & (((rword)1) << (__b__)) ? 1 : 0)
+//#define RPA_BITMAP_CLRBIT(__r__, __b__) do { (__r__)->userdata &= ~(((rword)1) << (__b__)); } while (0)
+//#define RPA_BITMAP_CLRALL(__r__) do { (__r__)->userdata = (rword)0; } while (0)
+//#define RPA_BITMAP_SETALL(__r__) do { (__r__)->userdata = (rword)-1; } while (0)
+//#define RPA_BITMAP_ORBITS(__r__, __c__) do { (__r__)->userdata |= (__c__)->userdata; } while (0)
+//#define RPA_BITMAP_SETVAL(__r__, __v__) do { (__r__)->userdata = __v__; } while (0)
+//#define RPA_BITMAP_GETVAL(__r__) ((__r__)->userdata)
+//#define RPA_BMAP_GETBIT(__bitmap__, __bit__) ((__bitmap__) & (((rpabitmap_t)1) << (__bit__)) ? 1 : 0)
 
 
 typedef struct rpa_bitmapcompiler_s {
index 2c55986..f8f20af 100644 (file)
@@ -421,7 +421,7 @@ int rpa_compiler_loop_end(rpa_compiler_t *co)
 }
 
 
-int rpa_compiler_rule_begin(rpa_compiler_t *co, const char *name, unsigned int namesize)
+int rpa_compiler_rule_begin(rpa_compiler_t *co, const char *name, unsigned int namesize, rpabitmap_t bitmap)
 {
        rpa_ruledef_t exp;
        long ruleuid = 0;
@@ -439,7 +439,11 @@ int rpa_compiler_rule_begin(rpa_compiler_t *co, const char *name, unsigned int n
        exp.startidx = rvm_codegen_addlabel_default(co->cg, name, namesize);
        exp.endidx = rpa_codegen_invalid_add_numlabel_s(co->cg, "__end", exp.start);
        exp.dataidx = rpa_compiler_addblob(co, ruleid, ruleuid, flags, name, namesize);
-
+       exp.bitmap = bitmap;
+       if (exp.bitmap) {
+               rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHBITMAP, DA, XX, XX, exp.bitmap));
+               rvm_codegen_addins(co->cg, rvm_asm(RVM_BXLES, LR, XX, XX, 0));
+       }
        rvm_codegen_addins(co->cg, rvm_asm(RPA_CHECKCACHE, DA, R_TOP, XX, exp.start));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BXNEQ, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R_REC, XX, XX, 0));
@@ -454,9 +458,9 @@ int rpa_compiler_rule_begin(rpa_compiler_t *co, const char *name, unsigned int n
 }
 
 
-int rpa_compiler_rule_begin_s(rpa_compiler_t *co, const char *name)
+int rpa_compiler_rule_begin_s(rpa_compiler_t *co, const char *name, rpabitmap_t bitmap)
 {
-       return rpa_compiler_rule_begin(co, name, r_strlen(name));
+       return rpa_compiler_rule_begin(co, name, r_strlen(name), bitmap);
 }
 
 
@@ -605,8 +609,9 @@ int rpa_compiler_exp_end(rpa_compiler_t *co)
 }
 
 
-int rpa_compiler_altexp_begin(rpa_compiler_t *co, unsigned int flags)
+int rpa_compiler_altexp_begin(rpa_compiler_t *co, unsigned int flags, rpabitmap_t bitmap)
 {
+
        rpa_ruledef_t exp;
 
        exp.flags = flags;
@@ -614,6 +619,11 @@ int rpa_compiler_altexp_begin(rpa_compiler_t *co, unsigned int flags)
        exp.start = rvm_codegen_getcodesize(co->cg);
        exp.startidx = rpa_codegen_add_numlabel_s(co->cg, "__begin", exp.start);
        exp.endidx = rpa_codegen_invalid_add_numlabel_s(co->cg, "__end", exp.start);
+       exp.bitmap = bitmap;
+       if (exp.bitmap) {
+               rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHBITMAP, DA, XX, XX, exp.bitmap));
+               rvm_codegen_addins(co->cg, rvm_asm(RVM_BXLES, LR, XX, XX, 0));
+       }
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, LR, XX, XX, 0));
 
@@ -633,12 +643,12 @@ int rpa_compiler_altexp_end(rpa_compiler_t *co)
        rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
-
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
 
        rvm_codegen_replaceins(co->cg, exp.branch, rvm_asm(RVM_B, DA, XX, XX, rvm_codegen_getcodesize(co->cg) - exp.branch));
        rpa_compiler_index_reference(co, exp.startidx, (exp.flags & RPA_MATCH_MASK));
+//     rvm_codegen_addins(co->cg, rvm_asm(RPA_VERIFYBITMAP, DA, XX, XX, exp.bitmap));
        return 0;
 }
 
index 5c5de47..047e1a2 100644 (file)
@@ -24,6 +24,7 @@
 #include "rvm/rvmcodegen.h"
 #include "rvm/rvmscope.h"
 #include "rpa/rpavm.h"
+#include "rpa/rpabitmap.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -60,6 +61,7 @@ typedef struct rpa_ruledef_s {
        long againidx;
        unsigned int ruleuid;
        unsigned int flags;
+       rpabitmap_t bitmap;
        rpa_rulepref_t *rulepref;
 } rpa_ruledef_t;
 
@@ -83,8 +85,8 @@ int rpa_compiler_loop_begin(rpa_compiler_t *co, const char *name, unsigned int n
 int rpa_compiler_loop_begin_s(rpa_compiler_t *co, const char *name);
 int rpa_compiler_loop_end(rpa_compiler_t *co);
 
-int rpa_compiler_rule_begin(rpa_compiler_t *co, const char *name, unsigned int namesize);
-int rpa_compiler_rule_begin_s(rpa_compiler_t *co, const char *name);
+int rpa_compiler_rule_begin(rpa_compiler_t *co, const char *name, unsigned int namesize, rpabitmap_t bitmap);
+int rpa_compiler_rule_begin_s(rpa_compiler_t *co, const char *name, rpabitmap_t bitmap);
 int rpa_compiler_rule_end(rpa_compiler_t *co);
 
 int rpa_compiler_inlinerule_begin(rpa_compiler_t *co, const char *name, unsigned int namesize, unsigned int flags);
@@ -94,7 +96,7 @@ int rpa_compiler_inlinerule_end(rpa_compiler_t *co);
 int rpa_compiler_exp_begin(rpa_compiler_t *co, unsigned int flags);
 int rpa_compiler_exp_end(rpa_compiler_t *co);
 
-int rpa_compiler_altexp_begin(rpa_compiler_t *co, unsigned int flags);
+int rpa_compiler_altexp_begin(rpa_compiler_t *co, unsigned int flags, rpabitmap_t bitmap);
 int rpa_compiler_altexp_end(rpa_compiler_t *co);
 
 int rpa_compiler_branch_begin(rpa_compiler_t *co, unsigned int flags);
index e2ea84a..8af01bb 100644 (file)
@@ -414,9 +414,11 @@ static int rpa_dbex_rh_namedrule(rpadbex_t *dbex, long rec)
                if ((prec->usertype & RPA_LOOP_PATH)) {
                        rpa_compiler_loop_begin(dbex->co, name, namesize);
                } else {
+#if 0
                        rvm_codegen_addins(dbex->co->cg, rvm_asm(RPA_MATCHBITMAP, DA, XX, XX, prec->userdata));
                        rvm_codegen_addins(dbex->co->cg, rvm_asm(RVM_BXLES, LR, XX, XX, 0));
-                       rpa_compiler_rule_begin(dbex->co, name, namesize);
+#endif
+                       rpa_compiler_rule_begin(dbex->co, name, namesize, RPA_BITMAP_GETVAL(RPA_RECORD2BITMAP(prec)));
                }
        }
        r_array_add(dbex->inlinestack, &rec);
@@ -634,7 +636,7 @@ static int rpa_dbex_rh_orop(rpadbex_t *dbex, long rec)
        prec = rpa_dbex_record(dbex, rec);
        R_ASSERT(prec);
        rpa_dbex_debug_recordhead(dbex, rec);
-       rpa_compiler_altexp_begin(dbex->co, prec->usertype & RPA_MATCH_MASK);
+       rpa_compiler_altexp_begin(dbex->co, prec->usertype & RPA_MATCH_MASK, RPA_BITMAP_GETVAL(RPA_RECORD2BITMAP(prec)));
        rpa_dbex_debug_recordtail(dbex, rec);
        if (rpa_dbex_playchildrecords(dbex, rec) < 0)
                return -1;
@@ -658,7 +660,7 @@ static int rpa_dbex_rh_norop(rpadbex_t *dbex, long rec)
        prec = rpa_dbex_record(dbex, rec);
        R_ASSERT(prec);
        rpa_dbex_debug_recordhead(dbex, rec);
-       rpa_compiler_altexp_begin(dbex->co, prec->usertype & RPA_MATCH_MASK);
+       rpa_compiler_altexp_begin(dbex->co, prec->usertype & RPA_MATCH_MASK, 0);
        rpa_dbex_debug_recordtail(dbex, rec);
        if (rpa_dbex_playchildrecords(dbex, rec) < 0)
                return -1;
@@ -968,6 +970,7 @@ rpadbex_t *rpa_dbex_create(void)
        dbex->inlinestack = r_array_create(sizeof(unsigned long));
        dbex->handlers = r_zmalloc(sizeof(rpa_dbex_recordhandler) * RPA_PRODUCTION_COUNT);
        rpa_dbex_cfgset(dbex, RPA_DBEXCFG_OPTIMIZATIONS, 1);
+       rpa_dbex_cfgset(dbex, RPA_DBEXCFG_BITMAP, 1);
 
        dbex->handlers[RPA_PRODUCTION_NONE] = rpa_dbex_rh_default;
        dbex->handlers[RPA_PRODUCTION_NAMEDRULE] = rpa_dbex_rh_namedrule;
@@ -1326,7 +1329,8 @@ void rpa_dbex_close(rpadbex_t *dbex)
                return;
        rpa_dbex_buildruleinfo(dbex);
        rpa_dbex_buildloopinfo(dbex);
-       rpa_dbex_buildbitmapinfo(dbex);
+       if (dbex->bitmap)
+               rpa_dbex_buildbitmapinfo(dbex);
 }
 
 
@@ -1386,6 +1390,7 @@ void rpa_dbex_dumpindented(rpadbex_t *dbex, long rec, int level, const char *rul
        if (!prec)
                return;
        r_memset(buffer, 0, sizeof(buffer));
+       r_printf("[ 0x%016lx ] ", prec->userdata);
        for (i = 0; i < level + 1; i++)
                r_printf("   ");
        r_printf("(");
@@ -1904,6 +1909,9 @@ long rpa_dbex_cfgset(rpadbex_t *dbex, unsigned long cfg, unsigned long val)
        } else if(cfg == RPA_DBEXCFG_DEBUG) {
                dbex->debug = val;
                return 0;
+       } else if(cfg == RPA_DBEXCFG_BITMAP) {
+               dbex->bitmap = val;
+               return 0;
        }
        return -1;
 }
@@ -1917,6 +1925,8 @@ long rpa_dbex_cfgget(rpadbex_t *dbex, unsigned long cfg)
                return dbex->optimizations;
        } else if(cfg == RPA_DBEXCFG_DEBUG) {
                return dbex->debug;
+       } else if(cfg == RPA_DBEXCFG_BITMAP) {
+               return dbex->bitmap;
        }
        return -1;
 }
index 460e3a2..a117e52 100644 (file)
@@ -68,6 +68,7 @@ typedef long rparule_t;
 
 #define RPA_DBEXCFG_OPTIMIZATIONS 1
 #define RPA_DBEXCFG_DEBUG 2
+#define RPA_DBEXCFG_BITMAP 3
 
 /**
  * @brief Return the version string of the RPA library.
@@ -329,11 +330,14 @@ rsize_t rpa_dbex_strncpy(rpadbex_t *dbex, char *dest, rparule_t rid, rsize_t siz
  *
  * Supported configuration IDs / Values:
  * - RPA_DBEXCFG_OPTIMIZATIONS
- *   - 0 Dissable optimizations
+ *   - 0 Disable optimizations
  *   - 1 Enable optimizations
  * - RPA_DBEXCFG_DEBUG
- *   - 0 Dissable debugging
+ *   - 0 Disable debugging
  *   - 1 Enable debugging
+ * - RPA_DBEXCFG_BITMAP
+ *   - 0 Disable bitmap
+ *   - 1 Enable bitmap
  */
 long rpa_dbex_cfgset(rpadbex_t *dbex, unsigned long cfg, unsigned long val);
 
@@ -348,6 +352,7 @@ long rpa_dbex_cfgset(rpadbex_t *dbex, unsigned long cfg, unsigned long val);
  * Supported configuration IDs
  * - RPA_DBEXCFG_OPTIMIZATIONS
  * - RPA_DBEXCFG_DEBUG
+ * - RPA_DBEXCFG_BITMAP
  */
 long rpa_dbex_cfgget(rpadbex_t *dbex, unsigned long cfg);
 
index 08de532..5db5f4c 100644 (file)
@@ -66,6 +66,7 @@ struct rpadbex_s {
        unsigned long optimizations:1;
        unsigned long debug:1;
        unsigned long compiled:1;
+       unsigned long bitmap:1;
 };
 
 int rpa_record2long(rparecord_t *prec, ruint32 *num);
index 84f046e..d750e9c 100644 (file)
@@ -81,9 +81,9 @@ static void rpa_production_directives(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "directives");
+       rpa_compiler_rule_begin_s(co, "directives", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "emit");
@@ -140,9 +140,9 @@ static void rpa_production_bnf(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
 //     rpa_compiler_rulepref_set_s(co, "bnf", 0, RPA_PRODUCTION_BNF);
-       rpa_compiler_rule_begin_s(co, "bnf");
+       rpa_compiler_rule_begin_s(co, "bnf", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "space");
@@ -193,7 +193,7 @@ static void rpa_production_directive_emitid(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "emitid", 0, RPA_PRODUCTION_DIRECTIVEEMITID, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "emitid");
+       rpa_compiler_rule_begin_s(co, "emitid", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -233,7 +233,7 @@ static void rpa_production_directive_emit(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "emit", 0, RPA_PRODUCTION_DIRECTIVEEMIT, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "emit");
+       rpa_compiler_rule_begin_s(co, "emit", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -262,7 +262,7 @@ static void rpa_production_directive_abort(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "abort", 0, RPA_PRODUCTION_DIRECTIVEABORT, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "abort");
+       rpa_compiler_rule_begin_s(co, "abort", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -293,7 +293,7 @@ static void rpa_production_directive_emitall(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "emitall", 0, RPA_PRODUCTION_DIRECTIVEEMITALL, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "emitall");
+       rpa_compiler_rule_begin_s(co, "emitall", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -324,7 +324,7 @@ static void rpa_production_directive_emitnone(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "emitnone", 0, RPA_PRODUCTION_DIRECTIVEEMITNONE, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "emitnone");
+       rpa_compiler_rule_begin_s(co, "emitnone", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -357,7 +357,7 @@ static void rpa_production_directive_noemit(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "noemit", 0, RPA_PRODUCTION_DIRECTIVENOEMIT, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "noemit");
+       rpa_compiler_rule_begin_s(co, "noemit", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -389,7 +389,7 @@ static void rpa_production_comment(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "comment");
+       rpa_compiler_rule_begin_s(co, "comment", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -419,7 +419,7 @@ static void rpa_production_namedrule(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "namedrule", 0, RPA_PRODUCTION_NAMEDRULE, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "namedrule");
+       rpa_compiler_rule_begin_s(co, "namedrule", 0);
 
        rpa_compiler_reference_opt_s(co, "space");
 
@@ -441,7 +441,7 @@ static void rpa_production_anonymousrule(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "anonymousrule", 0, RPA_PRODUCTION_ANONYMOUSRULE, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "anonymousrule");
+       rpa_compiler_rule_begin_s(co, "anonymousrule", 0);
 
        rpa_compiler_reference_opt_s(co, "space");
 
@@ -456,7 +456,7 @@ static void rpa_production_space(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "space");
+       rpa_compiler_rule_begin_s(co, "space", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ' '));
@@ -475,7 +475,7 @@ static void rpa_production_rulename(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "rulename", 0, RPA_PRODUCTION_RULENAME, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "rulename");
+       rpa_compiler_rule_begin_s(co, "rulename", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
@@ -509,7 +509,7 @@ static void rpa_production_aliasname(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "aliasname", 0, RPA_PRODUCTION_ALIASNAME, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "aliasname");
+       rpa_compiler_rule_begin_s(co, "aliasname", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
@@ -539,7 +539,7 @@ static void rpa_production_assign(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "assign");
+       rpa_compiler_rule_begin_s(co, "assign", 0);
        rpa_compiler_exp_begin(co, RPA_MATCH_NONE);
 
        rpa_compiler_reference_opt_s(co, "space");
@@ -562,7 +562,7 @@ static void rpa_production_assign(rpa_parser_t *pa)
 static void rpa_production_regexchar(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
-       rpa_compiler_rule_begin_s(co, "regexchar");
+       rpa_compiler_rule_begin_s(co, "regexchar", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ' '));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
@@ -622,7 +622,7 @@ static void rpa_production_char(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "char", 0, RPA_PRODUCTION_CHAR, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "char");
+       rpa_compiler_rule_begin_s(co, "char", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rpa_compiler_rule_end(co);
@@ -633,10 +633,10 @@ static void rpa_production_escapedchar(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "escapedchar");
+       rpa_compiler_rule_begin_s(co, "escapedchar", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\\'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "specialchar");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -656,7 +656,7 @@ static void rpa_production_specialchar(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "specialchar", 0, RPA_PRODUCTION_SPECIALCHAR, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "specialchar");
+       rpa_compiler_rule_begin_s(co, "specialchar", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'r'));
@@ -711,7 +711,7 @@ static void rpa_production_clschar(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "clschar", 0, RPA_PRODUCTION_CLSCHAR, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "clschar");
+       rpa_compiler_rule_begin_s(co, "clschar", 0);
 
        rpa_production_clschars(pa);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
@@ -725,7 +725,7 @@ static void rpa_production_beginchar(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "beginchar", 0, RPA_PRODUCTION_BEGINCHAR, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "beginchar");
+       rpa_compiler_rule_begin_s(co, "beginchar", 0);
 
 //     rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rpa_production_clschars(pa);
@@ -743,7 +743,7 @@ static void rpa_production_endchar(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "endchar", 0, RPA_PRODUCTION_ENDCHAR, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "endchar");
+       rpa_compiler_rule_begin_s(co, "endchar", 0);
 
 //     rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rpa_production_clschars(pa);
@@ -760,7 +760,7 @@ static void rpa_production_occurence(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "occurence", 0, RPA_PRODUCTION_OCCURENCE, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "occurence");
+       rpa_compiler_rule_begin_s(co, "occurence", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '?'));
@@ -781,7 +781,7 @@ static void rpa_production_charrng(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "charrng", 0, RPA_PRODUCTION_CHARRNG, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "charrng");
+       rpa_compiler_rule_begin_s(co, "charrng", 0);
        rpa_compiler_reference_nan_s(co, "beginchar");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
@@ -797,7 +797,7 @@ static void rpa_production_numrng(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "numrng", 0, RPA_PRODUCTION_NUMRNG, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "numrng");
+       rpa_compiler_rule_begin_s(co, "numrng", 0);
 
        rpa_compiler_reference_nan_s(co, "num");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -814,7 +814,7 @@ static void rpa_production_sqstr(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "sqstr");
+       rpa_compiler_rule_begin_s(co, "sqstr", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\''));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -837,7 +837,7 @@ static void rpa_production_dqstr(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "dqstr");
+       rpa_compiler_rule_begin_s(co, "dqstr", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '"'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -861,12 +861,12 @@ static void rpa_production_alphacls(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "alphacls");
+       rpa_compiler_rule_begin_s(co, "alphacls", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '['));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "charrng");
@@ -898,7 +898,7 @@ static void rpa_production_clsnum(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "clsnum", 0, RPA_PRODUCTION_CLSNUM, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "clsnum");
+       rpa_compiler_rule_begin_s(co, "clsnum", 0);
 
        rpa_compiler_reference_nan_s(co, "num");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -911,12 +911,12 @@ static void rpa_production_numcls(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "numcls");
+       rpa_compiler_rule_begin_s(co, "numcls", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '['));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "numrng");
@@ -944,9 +944,9 @@ static void rpa_production_cls(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "cls", 0, RPA_PRODUCTION_CLS, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "cls");
+       rpa_compiler_rule_begin_s(co, "cls", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "numcls");
@@ -969,7 +969,7 @@ static void rpa_production_dec(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "dec", 0, RPA_PRODUCTION_DEC, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "dec");
+       rpa_compiler_rule_begin_s(co, "dec", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '1', '9'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -985,7 +985,7 @@ static void rpa_production_hex(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "hex", 0, RPA_PRODUCTION_HEX, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "hex");
+       rpa_compiler_rule_begin_s(co, "hex", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
@@ -1006,12 +1006,12 @@ static void rpa_production_num(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "num");
+       rpa_compiler_rule_begin_s(co, "num", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '#'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_OPT, DA, XX, XX, '0'));
@@ -1043,7 +1043,7 @@ static void rpa_production_aref(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "aref", 0, RPA_PRODUCTION_AREF, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "aref");
+       rpa_compiler_rule_begin_s(co, "aref", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '<'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1063,7 +1063,7 @@ static void rpa_production_cref(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "cref", 0, RPA_PRODUCTION_CREF, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "cref");
+       rpa_compiler_rule_begin_s(co, "cref", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '<'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1088,9 +1088,9 @@ static void rpa_production_terminal(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "terminal");
+       rpa_compiler_rule_begin_s(co, "terminal", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "cls");
@@ -1134,9 +1134,9 @@ static void rpa_production_qchar(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "qchar");
+       rpa_compiler_rule_begin_s(co, "qchar", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "escapedchar");
@@ -1165,9 +1165,9 @@ static void rpa_production_qexp(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "qexp");
+       rpa_compiler_rule_begin_s(co, "qexp", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "terminal");
@@ -1194,7 +1194,7 @@ static void rpa_production_anchorop(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "anchorop", 0, RPA_PRODUCTION_ANCHOROP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "anchorop");
+       rpa_compiler_rule_begin_s(co, "anchorop", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '~'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rpa_compiler_reference_opt_s(co, "space");
@@ -1208,8 +1208,8 @@ static void rpa_production_anchorexp(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "anchorexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_rule_begin_s(co, "anchorexp", 0);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "anchorop");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1230,7 +1230,7 @@ static void rpa_production_notop(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "notop", 0, RPA_PRODUCTION_NOTOP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "notop");
+       rpa_compiler_rule_begin_s(co, "notop", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '^'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rpa_compiler_reference_opt_s(co, "space");
@@ -1246,8 +1246,8 @@ static void rpa_production_notexp(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "notexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_rule_begin_s(co, "notexp", 0);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "notop");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1269,7 +1269,7 @@ static void rpa_production_exp(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
 //     rpa_compiler_rulepref_set_s(co, "exp", 0, RPA_PRODUCTION_EXP);
-       rpa_compiler_rule_begin_s(co, "exp");
+       rpa_compiler_rule_begin_s(co, "exp", 0);
        rpa_compiler_reference_mul_s(co, "notexp");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rpa_compiler_rule_end(co);
@@ -1281,7 +1281,7 @@ static void rpa_production_bracketexp(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "bracketexp", 0, RPA_PRODUCTION_BRACKETEXP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "bracketexp");
+       rpa_compiler_rule_begin_s(co, "bracketexp", 0);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '('));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1306,7 +1306,7 @@ static void rpa_production_negbranch(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "negbranch", 0, RPA_PRODUCTION_NEGBRANCH, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "negbranch");
+       rpa_compiler_rule_begin_s(co, "negbranch", 0);
 
        rpa_compiler_reference_nan_s(co, "exp");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1320,7 +1320,7 @@ static void rpa_production_norop(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "norop", 0, RPA_PRODUCTION_NOROP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "norop");
+       rpa_compiler_rule_begin_s(co, "norop", 0);
 
        rpa_compiler_exp_begin(co, RPA_MATCH_MULTIPLE);
        rpa_compiler_reference_opt_s(co, "space");
@@ -1341,7 +1341,7 @@ static void rpa_production_reqop(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "reqop", 0, RPA_PRODUCTION_REQOP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "reqop");
+       rpa_compiler_rule_begin_s(co, "reqop", 0);
 
        rpa_compiler_reference_nan_s(co, "exp");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1355,7 +1355,7 @@ static void rpa_production_minop(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "minop", 0, RPA_PRODUCTION_MINOP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "minop");
+       rpa_compiler_rule_begin_s(co, "minop", 0);
 
        rpa_compiler_reference_nan_s(co, "reqop");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1371,8 +1371,8 @@ static void rpa_production_minexp(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "minexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_rule_begin_s(co, "minexp", 0);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "minop");
@@ -1394,7 +1394,7 @@ static void rpa_production_altbranch(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "altbranch", 0, RPA_PRODUCTION_ALTBRANCH, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "altbranch");
+       rpa_compiler_rule_begin_s(co, "altbranch", 0);
 
        rpa_compiler_reference_nan_s(co, "minexp");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1408,7 +1408,7 @@ static void rpa_production_orop(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
 
        rpa_compiler_rulepref_set_s(co, "orop", 0, RPA_PRODUCTION_OROP, RPA_RFLAG_EMITRECORD);
-       rpa_compiler_rule_begin_s(co, "orop");
+       rpa_compiler_rule_begin_s(co, "orop", 0);
 
        rpa_compiler_reference_nan_s(co, "altbranch");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -1438,8 +1438,8 @@ static void rpa_production_orexp(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "orexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_rule_begin_s(co, "orexp", 0);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "orop");
@@ -1541,7 +1541,7 @@ void rpa_production_(rpa_parser_t *pa)
 {
        rpa_compiler_t *co = pa->co;
 
-       rpa_compiler_rule_begin_s(co, "");
+       rpa_compiler_rule_begin_s(co, "", 0);
 
        rpa_compiler_rule_end(co);
 }
index 912f082..5b26d25 100644 (file)
@@ -227,9 +227,9 @@ rboolean rpa_stat_matchbitmap(rpastat_t *stat, rssize_t top, rpabitmap_t bitmap)
        if (in->eof)
                return 0;
        if (stat->encoding & RPA_ENCODING_ICASE) {
-               ret = (RPA_BMAP_GETBIT(bitmap, in->wc % RPA_BITMAP_BITS) || RPA_BMAP_GETBIT(bitmap, in->iwc % RPA_BITMAP_BITS)) ? TRUE : FALSE;
+               ret = (RPA_BITMAP_GETBIT(&bitmap, in->wc % RPA_BITMAP_BITS) || RPA_BITMAP_GETBIT(&bitmap, in->iwc % RPA_BITMAP_BITS)) ? TRUE : FALSE;
        } else {
-               ret = (RPA_BMAP_GETBIT(bitmap, in->wc % RPA_BITMAP_BITS)) ? TRUE : FALSE;
+               ret = (RPA_BITMAP_GETBIT(&bitmap, in->wc % RPA_BITMAP_BITS)) ? TRUE : FALSE;
        }
        return ret;
 }
index c8ccf14..0c37162 100644 (file)
@@ -48,6 +48,21 @@ static void rpavm_swi_matchbitmap(rvmcpu_t *cpu, rvm_asmins_t *ins)
 }
 
 
+static void rpavm_swi_verifybitmap(rvmcpu_t *cpu, rvm_asmins_t *ins)
+{
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rpabitmap_t bitmap = RVM_CPUREG_GETU(cpu, ins->op1);
+       long r0 = RVM_CPUREG_GETU(cpu, R0);
+
+       if (bitmap && r0 > 0) {
+               if (!rpa_stat_matchbitmap(stat, RVM_CPUREG_GETL(cpu, R_TOP) - r0, bitmap)) {
+                       if ((cpu->status & RVM_STATUS_N) == 0)
+                               rvm_cpu_abort(cpu);
+               }
+       }
+}
+
+
 static void rpavm_swi_matchchr_nan(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
        rpastat_t *stat = (rpastat_t *)cpu->userdata1;
@@ -441,6 +456,7 @@ static rvm_switable_t rpavm_swi_table[] = {
                {"RPA_ABORT", rpavm_swi_abort},
                {"RPA_PRNINFO", rpavm_swi_prninfo},
                {"RPA_MATCHBITMAP", rpavm_swi_matchbitmap},
+               {"RPA_VERIFYBITMAP", rpavm_swi_verifybitmap},
                {NULL, NULL},
 };
 
index 3b61a06..ec824cb 100644 (file)
@@ -74,6 +74,7 @@ extern "C" {
 #define RPA_ABORT                      RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 19))
 #define RPA_PRNINFO                    RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 20))
 #define RPA_MATCHBITMAP                RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 21))
+#define RPA_VERIFYBITMAP       RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 22))
 
 
 
index 58fce17..50182d9 100644 (file)
@@ -1,4 +1,9 @@
 #!emitall
+#!emit STag
+#!emit ETag
+#!emit Attribute
+#!abort ETag
+
 # BNF productsions from the XML spcification.
 
 Char           ::= [#x9] | [#xA] | [#xD] | [#x20-#xD7FF] | 
@@ -8,109 +13,109 @@ NameStartChar      ::= [:] | [A-Z] | [_] | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-
                    [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
                    [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | 
                    [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]                                         # [4]
-NameChar       ::= <:NameStartChar:> | [\-\.]|[0-9]|[#xB7]|[#x0300-#x036F]|[#x203F-#x2040]     # [4a]
-Name           ::= <:NameStartChar:><:NameChar:>*                                              # [5]
-Names          ::= <:Name:>([#x20]<:Name:>)*                                                   # [6]
-Nmtoken                ::= <:NameChar:>+                                                               # [7]
-Nmtokens       ::= <:Nmtoken:>([#x20]<:Nmtoken:>)*                                             # [8]
+NameChar       ::= <NameStartChar> | [\-\.]|[0-9]|[#xB7]|[#x0300-#x036F]|[#x203F-#x2040]       # [4a]
+Name           ::= <NameStartChar><NameChar>*                                                  # [5]
+Names          ::= <Name>([#x20]<Name>)*                                                       # [6]
+Nmtoken                ::= <NameChar>+                                                                 # [7]
+Nmtokens       ::= <Nmtoken>([#x20]<Nmtoken>)*                                                 # [8]
 
 # Literals
-EntityValue    ::= ( '"' ( ^[%&"] | <:PEReference:> | <:Reference:> )* '"' ) | 
-                   ( "'" ( ^[%&'] | <:PEReference:> | <:Reference:> )* "'" )                   # [9]
-AttValue       ::= '"' (^[<&"] | <:Reference:>)* '"' |  "'" (^[<&'] | <:Reference:>)* "'"      # [10]
+EntityValue    ::= ( '"' ( ^[%&"] | <PEReference> | <Reference> )* '"' ) | 
+                   ( "'" ( ^[%&'] | <PEReference> | <Reference> )* "'" )                       # [9]
+AttValue       ::= '"' (^[<&"] | <Reference>)* '"' |  "'" (^[<&'] | <Reference>)* "'"          # [10]
 SystemLiteral  ::= ('"' ^["]* '"') | ("'" ^[']* "'")                                           # [11]
-PubidLiteral   ::= (\"<:PubidChar:>*\") | (\'(<:PubidChar:> - \')*\')                          # [12]
+PubidLiteral   ::= (\"<PubidChar>*\") | (\'(<PubidChar> - \')*\')                              # [12]
 PubidChar      ::= [#x20] | [#xD] | [#xA] | [a-zA-Z0-9] | '-' | '#' | ['()+,./::=?;!*@$_%]     # [13]
 
 # Character Data
 CharData       ::= ^[<&]
-Comment                ::= '<!--' ((<:Char:> - '-') | ('-' (<:Char:> - '-')))* '-->'                   # [15]
+Comment                ::= '<!--' ((<Char> - '-') | ('-' (<Char> - '-')))* '-->'                       # [15]
 
 # Processing Instructions
-PI             ::= '<?' <:PITarget:> (<:S:> ((<:Char:> - '?>')*))? '?>'                        # [16]
-PITarget       ::= <:Name:> - [Xx][Mm][Ll]                                                     # [17]
+PI             ::= '<?' <PITarget> (<S> ((<Char> - '?>')*))? '?>'                              # [16]
+PITarget       ::= <Name> - [Xx][Mm][Ll]                                                       # [17]
 
 
 # CDATA Section
-CDSect         ::= <:CDStart:> <:CData:> <:CDEnd:>                                             # [18]
+CDSect         ::= <CDStart> <CData> <CDEnd>                                                   # [18]
 CDStart                ::= '<![CDATA['                                                                 # [19]
-CData          ::= (<:Char:> - ']]>')*                                                         # [20]
+CData          ::= (<Char> - ']]>')*                                                           # [20]
 CDEnd          ::= ']]>'                                                                       # [21]
 
 # Prolog
-XMLDecl                ::= '<?xml' <:VersionInfo:> <:EncodingDecl:>? <:SDDecl:>? <:S:>? '?>'           # [23]
-VersionInfo    ::= <:S:> 'version' <:Eq:> ("'" <:VersionNum:> "'" | '"' <:VersionNum:> '"')    # [24]
-Eq             ::= <:S:>? = <:S:>?                                                             # [25]
+XMLDecl                ::= '<?xml' <VersionInfo> <EncodingDecl>? <SDDecl>? <S>? '?>'                   # [23]
+VersionInfo    ::= <S> 'version' <Eq> ("'" <VersionNum> "'" | '"' <VersionNum> '"')            # [24]
+Eq             ::= <S>? = <S>?                                                                 # [25]
 VersionNum     ::= '1.' [0-9]+                                                                 # [26]
-Misc           ::= <:Comment:> | <:PI:> | <:S:>                                                # [27]  
-doctypedecl    ::= '<!DOCTYPE'<S><:Name:>(<S><:ExternalID:>)?<S>?('['<:intSubset:>']'<S>?)?'>' # [28]
-DeclSep                ::= <:PEReference:> | <:S:>                                                     # [28a]
-intSubset      ::= ( <:markupdecl:> | <:DeclSep:> )*                                           # [28b]
+Misc           ::= <Comment> | <PI> | <S>                                                      # [27]  
+doctypedecl    ::= '<!DOCTYPE'<S><Name>(<S><ExternalID>)?<S>?('['<intSubset>']'<S>?)?'>'       # [28]
+DeclSep                ::= <PEReference> | <S>                                                         # [28a]
+intSubset      ::= ( <markupdecl> | <DeclSep> )*                                               # [28b]
 
-markupdecl     ::= <:elementdecl:> | <:AttlistDecl:> | 
-                   <:EntityDecl:> | <:NotationDecl:> | <:PI:> | <:Comment:>                    # [29]
-prolog         ::= (<:XMLDecl:> | <:doctypedecl:>)<:Misc:>* (<:doctypedecl:> <:Misc:>*)?       # [22]
+markupdecl     ::= <elementdecl> | <AttlistDecl> | 
+                   <EntityDecl> | <NotationDecl> | <PI> | <Comment>                            # [29]
+prolog         ::= (<XMLDecl> | <doctypedecl>)<Misc>* (<doctypedecl> <Misc>*)?                 # [22]
 
 # External Subset
-extSubset      ::= <:TextDecl:>? <:extSubsetDecl:>                                             # [30]
-extSubsetDecl  ::= (<:markupdecl:> | <:conditionalSect:> | <:DeclSep:>)*                       # [31]
-SDDecl         ::= <:S:> 'standalone' <:Eq:>(("'" ('yes' | 'no') "'") |
+extSubset      ::= <TextDecl>? <extSubsetDecl>                                                 # [30]
+extSubsetDecl  ::= (<markupdecl> | <conditionalSect> | <DeclSep>)*                             # [31]
+SDDecl         ::= <S> 'standalone' <Eq>(("'" ('yes' | 'no') "'") |
                    ('"' ('yes' | 'no') '"'))                                                   # [32]
 
 #Start-tag
-STag           ::= '<' <:Name:> (<:S:><:Attribute:>)* <:S:>? '>'                               # [40]
-Attribute      ::= <:Name:> <:Eq:> <:AttValue:>                                                # [41]
-ETag           ::= '</' <:Name:> <:S:>? '>'                                                    # [42]
-content                ::= <:CharData:>?((<:element:>|<:Reference:>|<:CDSect:>|<:PI:>|
-                   <:Comment:>)<:CharData:>?)*                                                 # [43]
-EmptyElemTag   ::= '<' <:Name:> (<:S:><:Attribute:>)* <:S:>? '/>'                              # [44]
+STag           ::= '<' <Name> (<S><Attribute>)* <S>? '>'                                       # [40]
+Attribute      ::= <Name> <Eq> <AttValue>                                                      # [41]
+ETag           ::= '</' <Name> <S>? '>'                                                        # [42]
+content                ::= <CharData>?((<element>|<Reference>|<CDSect>|<PI>|
+                   <Comment>)<CharData>?)*                                                     # [43]
+EmptyElemTag   ::= '<' <Name> (<S><Attribute>)* <S>? '/>'                                      # [44]
 
 # Element
-element                ::= <:EmptyElemTag:> | (<:STag:> <:content:>* (<:ETag:>))                       # [39]
-
-elementdecl    ::= '<!ELEMENT'<:S:><:Name:><:S:><:contentspec:><:S:>? '>'                      # [45]
-contentspec    ::= 'EMPTY' | 'ANY' | <:Mixed:> | <:children:>                                  # [46]
-children       ::= (<:choice:> | <:seq:>) ('?' | '*' | '+')?                                   # [47]
-cp             ::= (<:Name:>|<:choice:>|<:seq:>) ('?' | '*' | '+')?                            # [48]
-choice         ::= '(' <:S:>? <:cp:> (<:S:>? '|' <:S:>? <:cp:>)+ <:S:>? ')'                    # [49]
-seq            ::= '(' <:S:>? <:cp:> (<:S:>? ',' <:S:>? <:cp:>)* <:S:>? ')'                    # [50]
-Mixed          ::= '(' <:S:>? '#PCDATA' (<:S:>? '|' <:S:>? <:Name:>)* <:S:>? ')*'|
-                   '(' <:S:>? '#PCDATA' <:S:>? ')'                                             # [51]
-
-AttlistDecl    ::= '<!ATTLIST' <:S:>  <:Name:> <:AttDef:>* <:S:>? '>'                          # [52]
-AttDef         ::= <:S:> <:Name:> <:S:> <:AttType:> <:S:> <:DefaultDecl:>                      # [53]
-AttType                ::= <:StringType:> | <:TokenizedType:> | <:EnumeratedType:>                     # [54]
+element                ::= <EmptyElemTag> | (<STag> <content>* (<ETag>))                               # [39]
+
+elementdecl    ::= '<!ELEMENT'<S><Name><S><contentspec><S>? '>'                                # [45]
+contentspec    ::= 'EMPTY' | 'ANY' | <Mixed> | <children>                                      # [46]
+children       ::= (<choice> | <seq>) ('?' | '*' | '+')?                                       # [47]
+cp             ::= (<Name>|<choice>|<seq>) ('?' | '*' | '+')?                                  # [48]
+choice         ::= '(' <S>? <cp> (<S>? '|' <S>? <cp>)+ <S>? ')'                                # [49]
+seq            ::= '(' <S>? <cp> (<S>? ',' <S>? <cp>)* <S>? ')'                                # [50]
+Mixed          ::= '(' <S>? '#PCDATA' (<S>? '|' <S>? <Name>)* <S>? ')*'|
+                   '(' <S>? '#PCDATA' <S>? ')'                                                 # [51]
+
+AttlistDecl    ::= '<!ATTLIST' <S>  <Name> <AttDef>* <S>? '>'                                  # [52]
+AttDef         ::= <S> <Name> <S> <AttType> <S> <DefaultDecl>                                  # [53]
+AttType                ::= <StringType> | <TokenizedType> | <EnumeratedType>                           # [54]
 StringType     ::= 'CDATA'                                                                     # [55]
 TokenizedType  ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'  # [56]
-EnumeratedType ::= <:NotationType:> | <:Enumeration:>                                          # [57]
-NotationType   ::= 'NOTATION' <:S:> '(' <:S:>? <:Name:>(<:S:>? '|' <:S:>?<:Name:>)*<:S:>? ')'  # [58]
-Enumeration    ::= '(' <:S:>? <:Nmtoken:> (<:S:>? '|' <:S:>? <:Nmtoken:>)* <:S:>? ')'          # [59]
-DefaultDecl    ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' <:S:>)? <:AttValue:>)                 # [60]
-conditionalSect        ::= <:includeSect:> | <:ignoreSect:>                                            # [61]
-includeSect    ::= '<![' <:S:>? 'INCLUDE' <:S:>? '[' <:extSubsetDecl:> ']]>'                   # [62]
-ignoreSect     ::= '<![' <:S:>? 'IGNORE' <:S:>? '[' <:ignoreSectContents:>* ']]>'              # [63]
-ignoreSectContents ::= <:Ignore:>? ('<![' <:ignoreSectContents:> ']]>' <:Ignore:>? )*          # [64]
-Ignore         ::= (<:Char:> - ('<![' | ']]>'))+
+EnumeratedType ::= <NotationType> | <Enumeration>                                              # [57]
+NotationType   ::= 'NOTATION' <S> '(' <S>? <Name>(<S>? '|' <S>?<Name>)*<S>? ')'                # [58]
+Enumeration    ::= '(' <S>? <Nmtoken> (<S>? '|' <S>? <Nmtoken>)* <S>? ')'                      # [59]
+DefaultDecl    ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' <S>)? <AttValue>)                     # [60]
+conditionalSect        ::= <includeSect> | <ignoreSect>                                                # [61]
+includeSect    ::= '<![' <S>? 'INCLUDE' <S>? '[' <extSubsetDecl> ']]>'                         # [62]
+ignoreSect     ::= '<![' <S>? 'IGNORE' <S>? '[' <ignoreSectContents>* ']]>'                    # [63]
+ignoreSectContents ::= <Ignore>? ('<![' <ignoreSectContents> ']]>' <Ignore>? )*                        # [64]
+Ignore         ::= (<Char> - ('<![' | ']]>'))+
 
 
 CharRef                ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'                                    # [66]
-Reference      ::= <:EntityRef:> | <:CharRef:>                                                 # [67]
-EntityRef      ::= '&' <:Name:> ';'                                                            # [68]
-PEReference    ::= '%' <:Name:> ';'                                                            # [69]
-EntityDecl     ::= <:GEDecl:> | <:PEDecl:>                                                     # [70]
-GEDecl         ::= '<!ENTITY' <:S:> <:Name:> <:S:> <:EntityDef:> <:S:>? '>'                    # [71]
-PEDecl         ::= '<!ENTITY' <:S:> '%' <:S:> <:Name:> <:S:> <:PEDef:> <:S:>? '>'              # [72]
-EntityDef      ::= <:EntityValue:> | (<:ExternalID:> <:NDataDecl:>?)                           # [73]
-PEDef          ::= <:EntityValue:> | <:ExternalID:>                                            # [74]
-ExternalID     ::= 'SYSTEM' <:S:>  <:SystemLiteral:> | 
-                   'PUBLIC' <:S:> <:PubidLiteral:> <:S:> <:SystemLiteral:>                     # [75]
-NDataDecl      ::= <:S:> 'NDATA' <:S:> <:Name:>                                                # [76]
-TextDecl       ::= '<?xml' <:VersionInfo:>? <:EncodingDecl:>  <:S:>? '?>'                      # [77]
-extParsedEnt   ::= <:TextDecl:>? <:content:>                                                   # [78]
+Reference      ::= <EntityRef> | <CharRef>                                                     # [67]
+EntityRef      ::= '&' <Name> ';'                                                              # [68]
+PEReference    ::= '%' <Name> ';'                                                              # [69]
+EntityDecl     ::= <GEDecl> | <PEDecl>                                                         # [70]
+GEDecl         ::= '<!ENTITY' <S> <Name> <S> <EntityDef> <S>? '>'                              # [71]
+PEDecl         ::= '<!ENTITY' <S> '%' <S> <Name> <S> <PEDef> <S>? '>'                          # [72]
+EntityDef      ::= <EntityValue> | (<ExternalID> <NDataDecl>?)                                 # [73]
+PEDef          ::= <EntityValue> | <ExternalID>                                                # [74]
+ExternalID     ::= 'SYSTEM' <S>  <SystemLiteral> | 
+                   'PUBLIC' <S> <PubidLiteral> <S> <SystemLiteral>                             # [75]
+NDataDecl      ::= <S> 'NDATA' <S> <Name>                                                      # [76]
+TextDecl       ::= '<?xml' <VersionInfo>? <EncodingDecl>  <S>? '?>'                            # [77]
+extParsedEnt   ::= <TextDecl>? <content>                                                       # [78]
 EncName                ::= [A-Za-z] ([A-Za-z0-9._] | '-')*                                             # [81]
-NotationDecl   ::= '<!NOTATION' <:S:> <:Name:> <:S:> (<:ExternalID:> | <:PublicID:>)<:S:>? '>' # [82]
-PublicID       ::= 'PUBLIC' <:S:> <:PubidLiteral:>                                             # [83]
-EncodingDecl   ::= <:S:> 'encoding' <:Eq:> ('"' <:EncName:> '"' | "'" <:EncName:> "'" )        # [80]
+NotationDecl   ::= '<!NOTATION' <S> <Name> <S> (<ExternalID> | <PublicID>)<S>? '>'             # [82]
+PublicID       ::= 'PUBLIC' <S> <PubidLiteral>                                                 # [83]
+EncodingDecl   ::= <S> 'encoding' <Eq> ('"' <EncName> '"' | "'" <EncName> "'" )                # [80]
 
-document       ::= <:prolog:>? <:element:> <:Misc:>*                                           # [1]
-exec           ::= <:document:>
+document       ::= <prolog>? <element> <Misc>*                                                 # [1]
+exec           ::= <document>
index 0b9ac71..acc016f 100644 (file)
@@ -16,7 +16,7 @@
 void code_rpa_matchaltexp(rpa_compiler_t *co, rpastat_t *stat)
 {
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'd'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -38,7 +38,7 @@ void code_rpa_matchaltexp(rpa_compiler_t *co, rpastat_t *stat)
        VMTEST_STATUS(co->cg, 0, "RPA_MATCH_NONE STATUS");
 
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
-       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_MULTIPLE, 0);
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'g'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
index 64984d0..6d45012 100644 (file)
@@ -15,7 +15,7 @@
 
 void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_matchabc");
+       rpa_compiler_rule_begin_s(co, "rpa_matchabc", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'a'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'b'));
@@ -28,7 +28,7 @@ void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_matchxyz");
+       rpa_compiler_rule_begin_s(co, "rpa_matchxyz", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'x'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'y'));
index 3026410..2f25188 100644 (file)
@@ -14,7 +14,7 @@
 
 void code_rpa_match_num(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_num");
+       rpa_compiler_rule_begin_s(co, "rpa_match_num", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
@@ -29,7 +29,7 @@ void code_rpa_match_num(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_loopnum(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_loopnum");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_loopnum");
@@ -60,9 +60,9 @@ void code_rpa_match_loopnum(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_match_mathop(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_mathop");
+       rpa_compiler_rule_begin_s(co, "rpa_match_mathop", 0);
 
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_num");
index ec1b086..8b6b482 100644 (file)
@@ -16,7 +16,7 @@
 void code_rpa_match_aloop(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_aloop");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_aloop");
@@ -48,7 +48,7 @@ void code_rpa_match_aloop(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_xloop(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_xloop");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_xloop");
index 8f5ae78..f285822 100644 (file)
@@ -18,7 +18,7 @@
  */
 void code_rpa_match_num(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_num");
+       rpa_compiler_rule_begin_s(co, "rpa_match_num", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
@@ -32,7 +32,7 @@ void code_rpa_match_num(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_match_var(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_var");
+       rpa_compiler_rule_begin_s(co, "rpa_match_var", 0);
 
        rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
@@ -57,8 +57,8 @@ void code_rpa_match_var(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_match_term(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_term");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_rule_begin_s(co, "rpa_match_term", 0);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_num");
@@ -91,7 +91,7 @@ void code_rpa_match_term(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_match_mulop(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_mulop");
+       rpa_compiler_rule_begin_s(co, "rpa_match_mulop", 0);
 
        rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -111,7 +111,7 @@ void code_rpa_match_mulop(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_match_divop(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_divop");
+       rpa_compiler_rule_begin_s(co, "rpa_match_divop", 0);
 
        rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
@@ -133,7 +133,7 @@ void code_rpa_match_divop(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_mulexp(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_mulexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_mulop");
@@ -159,7 +159,7 @@ void code_rpa_match_mulexp(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_addexp(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_addexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_addexp");
@@ -198,7 +198,7 @@ void code_rpa_match_addexp(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_orexp(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_orexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_orexp");
@@ -224,7 +224,7 @@ void code_rpa_match_orexp(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_andexp(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_andexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_andexp");
@@ -250,7 +250,7 @@ void code_rpa_match_andexp(rpa_compiler_t *co, rpastat_t *stat)
 void code_rpa_match_xorexp(rpa_compiler_t *co, rpastat_t *stat)
 {
        rpa_compiler_loop_begin_s(co, "rpa_match_xorexp");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
 
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_match_xorexp");
index b01e35a..a7c1b3e 100644 (file)
@@ -15,7 +15,7 @@
 
 void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_matchabc");
+       rpa_compiler_rule_begin_s(co, "rpa_matchabc", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'a'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'b'));
@@ -28,7 +28,7 @@ void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_matchxyz");
+       rpa_compiler_rule_begin_s(co, "rpa_matchxyz", 0);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'x'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'y'));
@@ -41,8 +41,8 @@ void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
 
 void code_rpa_match_abcorxyz(rpa_compiler_t *co, rpastat_t *stat)
 {
-       rpa_compiler_rule_begin_s(co, "rpa_match_abcorxyz");
-       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
+       rpa_compiler_rule_begin_s(co, "rpa_match_abcorxyz", 0);
+       rpa_compiler_altexp_begin(co, RPA_MATCH_NONE, 0);
        rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
        rpa_compiler_reference_nan_s(co, "rpa_matchxyz");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));