summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-08-29 13:29:54 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-08-29 13:29:54 +0900
commit441ff45a51813ac10f528a5f701769632259835f (patch)
tree3bc61e596492c9d7eb869337cbfa6beca23b02c1
parent98c759e86a73c2e2220c7b9d36a9d78177891273 (diff)
parentfbe876b87169c9d5c55e79cc932790297f98a1be (diff)
downloadmruby-441ff45a51813ac10f528a5f701769632259835f.tar.gz
mruby-441ff45a51813ac10f528a5f701769632259835f.zip
Merge branch 'node_negate_fix' of https://github.com/ukrainskiysergey/mruby into ukrainskiysergey-node_negate_fix
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 13f5aa053..0d47b236d 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -2406,12 +2406,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));
@@ -2423,8 +2422,8 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_INT:
if (val) {
- 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_bool overflow;
@@ -2455,13 +2454,11 @@ codegen(codegen_scope *s, node *tree, int val)
default:
if (val) {
- int sym = new_sym(s, mrb_intern_lit(s->mrb, "-"));
-
- genop_1(s, OP_LOADI_0, cursp());
- push();
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, "-@"));
codegen(s, tree, VAL);
- pop(); pop();
- genop_2(s, OP_SUB, cursp(), sym);
+ pop();
+ genop_3(s, OP_SEND, cursp(), sym, 0);
+ push();
}
else {
codegen(s, tree, NOVAL);