diff options
| -rw-r--r-- | include/mruby/numeric.h | 10 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 7 |
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); |
