diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-02-17 23:08:58 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-02-17 23:08:58 -0800 |
| commit | 9b06a4506ed2ae222b19cafd184c66521b720581 (patch) | |
| tree | 7284c80d736823c33978dce1f217973d108a905f /src/codegen.c | |
| parent | 7ba3275bf70fa62a34ea9015e2b03eefd180afe9 (diff) | |
| parent | e0f25b1fda0c9c67526885fafdabf35d4d4039b7 (diff) | |
| download | mruby-9b06a4506ed2ae222b19cafd184c66521b720581.tar.gz mruby-9b06a4506ed2ae222b19cafd184c66521b720581.zip | |
Merge pull request #850 from mattn/pluggable_regexp
Pluggable regexp
Diffstat (limited to 'src/codegen.c')
| -rw-r--r-- | src/codegen.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/codegen.c b/src/codegen.c index 1f6d16477..86cb5eb87 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -16,6 +16,7 @@ #include <string.h> #include <stdlib.h> #include <ctype.h> +#include "re.h" typedef mrb_ast_node node; typedef struct mrb_parser_state parser_state; @@ -1910,6 +1911,25 @@ codegen(codegen_scope *s, node *tree, int val) } break; + case NODE_REGX: + if (val) { + char *p1 = (char*)tree->car; + //char *p2 = (char*)tree->cdr; + int ai = mrb_gc_arena_save(s->mrb); + struct RClass* c = mrb_class_get(s->mrb, REGEXP_CLASS); + mrb_value args[2]; + args[0] = mrb_str_new(s->mrb, p1, strlen(p1)); + // TODO: Some regexp implementation does not have second argument + //args[1] = mrb_str_new(s->mrb, p2, strlen(p2)); + int off = new_lit(s, + mrb_class_new_instance(s->mrb, 1, args, c)); + + mrb_gc_arena_restore(s->mrb, ai); + genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); + push(); + } + break; + case NODE_SYM: if (val) { int sym = new_sym(s, sym(tree)); |
