summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-07-21 13:20:34 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-07-21 13:20:34 +0900
commite42f192827102a6aa7a398d0360e310ed2ae20d2 (patch)
tree0a1acdc15f99a9dc59b7875b09be01de300f5b78 /mrbgems/mruby-compiler/core/codegen.c
parent2ef6e944896072687bdd28c846a62e5be37eec48 (diff)
downloadmruby-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.c19
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 {