summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorUkrainskiy Sergey <[email protected]>2018-08-09 17:14:00 +0900
committerUkrainskiy Sergey <[email protected]>2018-08-09 17:31:57 +0900
commite3b181586c3f433debc7b5c4b7d45f8b8fe91970 (patch)
tree9d67cb8fae6c4ed8ee443784adf053ea8368b7c3 /mrbgems/mruby-compiler/core/codegen.c
parent35be8b252495d92ca811d76996f03c470ee33380 (diff)
downloadmruby-e3b181586c3f433debc7b5c4b7d45f8b8fe91970.tar.gz
mruby-e3b181586c3f433debc7b5c4b7d45f8b8fe91970.zip
Fix weird behavior of the NODE_NEGATE
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c13
1 files 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);