diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-17 15:29:28 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-18 02:02:30 +0900 |
| commit | c2bbfa5b61450426f286f5a5e45c7ea479edf90c (patch) | |
| tree | 9e2de0344c504a2011444ea7754a2b3c636a9253 /mrbgems/mruby-compiler/core | |
| parent | b0886d5692dd58bed608fe8fb2be0c017c729060 (diff) | |
| download | mruby-c2bbfa5b61450426f286f5a5e45c7ea479edf90c.tar.gz mruby-c2bbfa5b61450426f286f5a5e45c7ea479edf90c.zip | |
NODE_NEGATE cdr may not be code-node; fix #3348 ref #3324
Reported by Denis Kasak https://hackerone.com/dkasak
Diffstat (limited to 'mrbgems/mruby-compiler/core')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 90bafb3c2..fc54a0647 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2231,13 +2231,9 @@ codegen(codegen_scope *s, node *tree, int val) { nt = (intptr_t)tree->car; tree = tree->cdr; - if (!val) { - codegen(s, tree, NOVAL); - break; - } switch (nt) { case NODE_FLOAT: - { + if (val) { char *p = (char*)tree; mrb_float f = mrb_float_read(p, NULL); int off = new_lit(s, mrb_float_value(s->mrb, -f)); @@ -2248,7 +2244,7 @@ codegen(codegen_scope *s, node *tree, int val) break; case NODE_INT: - { + if (val) { char *p = (char*)tree->car; int base = (intptr_t)tree->cdr->car; mrb_int i; @@ -2277,7 +2273,7 @@ codegen(codegen_scope *s, node *tree, int val) break; default: - { + if (val) { int sym = new_msym(s, mrb_intern_lit(s->mrb, "-")); genop(s, MKOP_ABx(OP_LOADI, cursp(), 0)); @@ -2286,6 +2282,9 @@ codegen(codegen_scope *s, node *tree, int val) pop(); pop(); genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2)); } + else { + codegen(s, tree, NOVAL); + } break; } } |
