diff options
| author | Yukihiro Matz Matsumoto <[email protected]> | 2013-02-21 16:01:09 +0900 |
|---|---|---|
| committer | Yukihiro Matz Matsumoto <[email protected]> | 2013-02-21 16:01:09 +0900 |
| commit | c15af5d562e05399ab6fb53ea05235b1e2520063 (patch) | |
| tree | 9460ba7713901ee1cc8f9383d05e2325a841a800 | |
| parent | ffd7aeeb6840d55e406cea08d2b8514430e3b346 (diff) | |
| download | mruby-c15af5d562e05399ab6fb53ea05235b1e2520063.tar.gz mruby-c15af5d562e05399ab6fb53ea05235b1e2520063.zip | |
compile /a/ as ::Regexp.new("a")
| -rw-r--r-- | src/codegen.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/codegen.c b/src/codegen.c index 8cb571a28..6c7f10805 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1914,18 +1914,27 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_REGX: if (val) { char *p1 = (char*)tree->car; - //char *p2 = (char*)tree->cdr; + 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]; - int off; - - 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)) - 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)); + int sym = new_sym(s, mrb_intern(s->mrb, REGEXP_CLASS)); + int off = new_lit(s, mrb_str_new(s->mrb, p1, strlen(p1))); + int n = 1; + + genop(s, MKOP_A(OP_OCLASS, cursp())); + genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym)); + push(); + genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + if (p2) { + push(); + off = new_lit(s, mrb_str_new(s->mrb, p2, strlen(p2))); + genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + n++; + pop(); + } + pop(); + sym = new_sym(s, mrb_intern(s->mrb, "new")); + genop(s, MKOP_ABC(OP_SEND, cursp(), sym, n)); + mrb_gc_arena_restore(s->mrb, ai); push(); } break; |
