diff options
| author | mattn <[email protected]> | 2013-03-21 19:45:47 +0900 |
|---|---|---|
| committer | mattn <[email protected]> | 2013-03-21 19:45:47 +0900 |
| commit | 1ab4dbcbf365d0ef75d08d28478c06fcf8628afe (patch) | |
| tree | df456fe8f936e1d5c02549402c32aad9caff9184 /src/codegen.c | |
| parent | 605035bc4261f25063ecf77765b9f844b6e98357 (diff) | |
| download | mruby-1ab4dbcbf365d0ef75d08d28478c06fcf8628afe.tar.gz mruby-1ab4dbcbf365d0ef75d08d28478c06fcf8628afe.zip | |
Backtick operation
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 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; |
