diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-21 13:20:34 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-21 13:20:34 +0900 |
| commit | e42f192827102a6aa7a398d0360e310ed2ae20d2 (patch) | |
| tree | 0a1acdc15f99a9dc59b7875b09be01de300f5b78 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 2ef6e944896072687bdd28c846a62e5be37eec48 (diff) | |
| download | mruby-e42f192827102a6aa7a398d0360e310ed2ae20d2.tar.gz mruby-e42f192827102a6aa7a398d0360e310ed2ae20d2.zip | |
codegen.c: skip `-@` call if the argument is a literal integer.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index b173a83c5..57b722cbf 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -858,6 +858,21 @@ gen_int(codegen_scope *s, uint16_t dst, mrb_int i) } } +static void +gen_uminus(codegen_scope *s, uint16_t dst) +{ + struct mrb_insn_data data = mrb_last_insn(s); + int32_t n; + + if (get_int_operand(&data, &n)) { + s->pc = s->lastpc; + gen_int(s, dst, -n); + } + else { + genop_3(s, OP_SEND, dst, new_sym(s, MRB_OPSYM_2(s->mrb, minus)), 0); + } +} + static int node_len(node *tree) { @@ -2695,10 +2710,10 @@ codegen(codegen_scope *s, node *tree, int val) default: if (val) { - int sym = new_sym(s, MRB_OPSYM_2(s->mrb, minus)); codegen(s, tree, VAL); pop(); - genop_3(s, OP_SEND, cursp(), sym, 0); + push_n(2);pop_n(2); /* space for receiver&block */ + gen_uminus(s, cursp()); push(); } else { |
