diff options
| author | Ukrainskiy Sergey <[email protected]> | 2018-08-09 17:14:00 +0900 |
|---|---|---|
| committer | Ukrainskiy Sergey <[email protected]> | 2018-08-09 17:31:57 +0900 |
| commit | e3b181586c3f433debc7b5c4b7d45f8b8fe91970 (patch) | |
| tree | 9d67cb8fae6c4ed8ee443784adf053ea8368b7c3 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 35be8b252495d92ca811d76996f03c470ee33380 (diff) | |
| download | mruby-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.c | 13 |
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); |
