summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-03-21 23:25:03 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2013-03-21 23:25:03 -0700
commitab7bd61596e0d684c27d08088e51cca092291751 (patch)
treee7af45d8632180b7c6b56db0df7013b0a1ff1013 /src/codegen.c
parentf6646f44c2a33147b7f491d1551243c96f72ab25 (diff)
parent4be161c43c4c22c9d3e081e30cf5964ab970a0a7 (diff)
downloadmruby-ab7bd61596e0d684c27d08088e51cca092291751.tar.gz
mruby-ab7bd61596e0d684c27d08088e51cca092291751.zip
Merge pull request #1040 from mattn/backtick
xquote operator
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 7a91d597d..8fb1eebe9 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_intern2(s->mrb, "Kernel", 6));
+ 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_intern2(s->mrb, "`", 1));
+ 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;