From 1ab4dbcbf365d0ef75d08d28478c06fcf8628afe Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 21 Mar 2013 19:45:47 +0900 Subject: Backtick operation --- src/codegen.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 7a91d597d..1e4802d01 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2031,6 +2031,26 @@ codegen(codegen_scope *s, node *tree, int val) gen_literal_array(s, tree, TRUE, val); break; + case NODE_XSTR: + if (val) { + char *p = (char*)tree->car; + size_t len = (intptr_t)tree->cdr; + int ai = mrb_gc_arena_save(s->mrb); + int sym = new_sym(s, mrb_intern(s->mrb, "Kernel")); + int off = new_lit(s, mrb_str_new(s->mrb, p, len)); + + genop(s, MKOP_A(OP_OCLASS, cursp())); + genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym)); + push(); + genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + pop(); + sym = new_sym(s, mrb_intern(s->mrb, "__backtick__")); + genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1)); + mrb_gc_arena_restore(s->mrb, ai); + push(); + } + break; + case NODE_REGX: if (val) { char *p1 = (char*)tree->car; -- cgit v1.2.3