From e3b181586c3f433debc7b5c4b7d45f8b8fe91970 Mon Sep 17 00:00:00 2001 From: Ukrainskiy Sergey Date: Thu, 9 Aug 2018 17:14:00 +0900 Subject: Fix weird behavior of the NODE_NEGATE --- mrbgems/mruby-compiler/core/codegen.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index fec747f0c..ceedb49ad 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2323,12 +2323,11 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_NEGATE: { nt = nint(tree->car); - tree = tree->cdr; switch (nt) { #ifndef MRB_WITHOUT_FLOAT case NODE_FLOAT: if (val) { - char *p = (char*)tree; + char *p = (char*)tree->cdr; mrb_float f = mrb_float_read(p, NULL); int off = new_lit(s, mrb_float_value(s->mrb, -f)); @@ -2340,6 +2339,7 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_INT: if (val) { + tree = tree->cdr; char *p = (char*)tree->car; int base = nint(tree->cdr->car); mrb_int i; @@ -2373,13 +2373,10 @@ codegen(codegen_scope *s, node *tree, int val) default: if (val) { - int sym = new_msym(s, mrb_intern_lit(s->mrb, "-")); - - genop(s, MKOP_ABx(OP_LOADI, cursp(), 0)); - push(); + int sym = new_msym(s, mrb_intern_lit(s->mrb, "-@")); codegen(s, tree, VAL); - pop(); pop(); - genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2)); + pop(); + genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 0)); } else { codegen(s, tree, NOVAL); -- cgit v1.2.3 From 672110dbe8b116d2ef5594d908e5e2bfe2231a18 Mon Sep 17 00:00:00 2001 From: Ukrainskiy Sergey Date: Thu, 9 Aug 2018 17:57:18 +0900 Subject: Small fix --- mrbgems/mruby-compiler/core/codegen.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index ceedb49ad..471956f92 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2339,9 +2339,8 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_INT: if (val) { - tree = tree->cdr; - char *p = (char*)tree->car; - int base = nint(tree->cdr->car); + char *p = (char*)tree->cdr->car; + int base = nint(tree->cdr->cdr->car); mrb_int i; mrb_code co; mrb_bool overflow; -- cgit v1.2.3 From fbe876b87169c9d5c55e79cc932790297f98a1be Mon Sep 17 00:00:00 2001 From: Ukrainskiy Sergey Date: Fri, 10 Aug 2018 06:44:19 +0900 Subject: Added push() after OP_SEND --- mrbgems/mruby-compiler/core/codegen.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 471956f92..12725f4f3 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2376,6 +2376,7 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, tree, VAL); pop(); genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 0)); + push(); } else { codegen(s, tree, NOVAL); -- cgit v1.2.3