summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-10-19 12:13:05 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-10-19 12:13:05 +0900
commit90484cac6320ccb158d7373a2f865dddd623de17 (patch)
treecf63c4e9fff7cbaa0bba3557850358ea91c4c091 /mrbgems/mruby-compiler/core/codegen.c
parent5d5e4f521464d134250501774f49f61f11dc3997 (diff)
downloadmruby-90484cac6320ccb158d7373a2f865dddd623de17.tar.gz
mruby-90484cac6320ccb158d7373a2f865dddd623de17.zip
codegen.c: skip `OP_LOADSELF` using `OP_SSEND`.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 9038c9845..7edcd2029 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -1641,10 +1641,15 @@ static void
gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
{
mrb_sym sym = name ? name : nsym(tree->cdr->car);
- int skip = 0;
- int n = 0, nk = 0, noop = 0, blk = 0, sp_save = cursp();
+ int skip = 0, n = 0, nk = 0, noop = 0, noself = 0, blk = 0, sp_save = cursp();
- codegen(s, tree->car, VAL); /* receiver */
+ if (!tree->car) {
+ noself = noop = 1;
+ push();
+ }
+ else {
+ codegen(s, tree->car, VAL); /* receiver */
+ }
if (safe) {
int recv = cursp()-1;
gen_move(s, cursp(), recv, 1);
@@ -1733,6 +1738,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
else if (!noop && n == 1 && gen_binop(s, sym, cursp())) {
/* constant folding succeeded */
}
+ else if (noself ){
+ genop_3(s, blk ? OP_SSENDB : OP_SSEND, cursp(), new_sym(s, sym), n|(nk<<4));
+ }
else {
genop_3(s, blk ? OP_SENDB : OP_SEND, cursp(), new_sym(s, sym), n|(nk<<4));
}