summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-09-10 10:23:28 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-09-10 10:23:28 +0900
commit28b5c30b964c9e6121a2ee04454905c81a3e2646 (patch)
tree8e63ca79d1404d32534dcb2a0022c064d6bfabc6 /src
parentb34713304a983a0a6e3259bd0b5f3215ac2ee14a (diff)
downloadmruby-28b5c30b964c9e6121a2ee04454905c81a3e2646.tar.gz
mruby-28b5c30b964c9e6121a2ee04454905c81a3e2646.zip
ops.h: add `OP_SYMBOL` instruction.
It generates a symbol by interning from the pool string.
Diffstat (limited to 'src')
-rw-r--r--src/codedump.c5
-rw-r--r--src/vm.c17
2 files changed, 21 insertions, 1 deletions
diff --git a/src/codedump.c b/src/codedump.c
index 542e54904..b0a7676f0 100644
--- a/src/codedump.c
+++ b/src/codedump.c
@@ -455,6 +455,11 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
printf("OP_INTERN\tR%d", a);
print_lv_a(mrb, irep, a);
break;
+ CASE(OP_SYMBOL, BB):
+ mrb_assert((irep->pool[b].tt&IREP_TT_NFLAG)==0);
+ printf("OP_SYMBOL\tR%d\tL(%d)\t; %s", a, b, irep->pool[b].u.str);
+ print_lv_a(mrb, irep, a);
+ break;
CASE(OP_STRING, BB):
if ((irep->pool[b].tt & IREP_TT_NFLAG) == 0) {
printf("OP_STRING\tR%d\tL(%d)\t; %s", a, b, irep->pool[b].u.str);
diff --git a/src/vm.c b/src/vm.c
index 1cc3a8df7..8ed22d7f6 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -2630,7 +2630,22 @@ RETRY_TRY_BLOCK:
mrb_sym sym = mrb_intern_str(mrb, regs[a]);
regs[a] = mrb_symbol_value(sym);
- mrb_gc_arena_restore(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_SYMBOL, BB) {
+ size_t len;
+ mrb_sym sym;
+
+ mrb_assert((pool[b].tt&IREP_TT_NFLAG)==0);
+ len = pool[b].tt >> 2;
+ if (pool[b].tt & IREP_TT_SFLAG) {
+ sym = mrb_intern_static(mrb, pool[b].u.str, len);
+ }
+ else {
+ sym = mrb_intern(mrb, pool[b].u.str, len);
+ }
+ regs[a] = mrb_symbol_value(sym);
NEXT;
}