summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/numeric.h10
-rw-r--r--mrbgems/mruby-eval/src/eval.c7
2 files changed, 16 insertions, 1 deletions
diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h
index e4086487e..36489b1ce 100644
--- a/include/mruby/numeric.h
+++ b/include/mruby/numeric.h
@@ -42,6 +42,16 @@ mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
# define MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
#endif
+// Clang 3.8 and 3.9 have problem compiling mruby in 32-bit mode, when MRB_INT64 is set
+// because of missing __mulodi4 and similar functions in its runtime. We need to use custom
+// implementation for them.
+#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
+#if defined(__clang__) && (__clang_major__ == 3) && (__clang_minor__ >= 8) && \
+ defined(MRB_32BIT) && defined(MRB_INT64)
+#undef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
+#endif
+#endif
+
#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
#ifndef MRB_WORD_BOXING
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c
index 81bc80280..907e3f666 100644
--- a/mrbgems/mruby-eval/src/eval.c
+++ b/mrbgems/mruby-eval/src/eval.c
@@ -131,6 +131,10 @@ patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest)
}
}
break;
+
+ case OP_STOP:
+ irep->iseq[i] = MKOP_AB(OP_RETURN, irep->nlocals, OP_R_NORMAL);
+ break;
}
}
}
@@ -194,7 +198,8 @@ create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, con
e->cioff = c->ci - c->cibase - 1;
e->stack = c->ci->stackent;
MRB_SET_ENV_STACK_LEN(e, c->ci[-1].proc->body.irep->nlocals);
- c->ci->env = e;
+ c->ci->target_class = proc->target_class;
+ c->ci->env = 0;
proc->env = e;
patch_irep(mrb, proc->body.irep, 0);