summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-12-17 15:29:28 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-12-18 02:02:30 +0900
commitc2bbfa5b61450426f286f5a5e45c7ea479edf90c (patch)
tree9e2de0344c504a2011444ea7754a2b3c636a9253
parentb0886d5692dd58bed608fe8fb2be0c017c729060 (diff)
downloadmruby-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
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c13
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;
}
}