diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-08-23 22:13:02 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-08-23 22:15:42 +0900 |
| commit | be78b5d8f797a121ca6fbb60cbfe33c6ba709a64 (patch) | |
| tree | 3688daebfc09bdfcbae292541206a1b9c6bc8842 /include | |
| parent | 14d5a86b299a2e1de990dc441710e3df5e8c4da0 (diff) | |
| download | mruby-be78b5d8f797a121ca6fbb60cbfe33c6ba709a64.tar.gz mruby-be78b5d8f797a121ca6fbb60cbfe33c6ba709a64.zip | |
Fix `RBreak` exceeding 6 words on 32-bit mode w/o boxing and `MRB_USE_FLOAT`
ref: https://github.com/mruby/mruby/pull/4483#issuecomment-498001736
In this configuration, `tt` of `RBreak::val` is set into `RBreak::flags`.
Diffstat (limited to 'include')
| -rw-r--r-- | include/mruby/boxing_no.h | 16 | ||||
| -rw-r--r-- | include/mruby/error.h | 28 |
2 files changed, 37 insertions, 7 deletions
diff --git a/include/mruby/boxing_no.h b/include/mruby/boxing_no.h index 152471913..b22580bf6 100644 --- a/include/mruby/boxing_no.h +++ b/include/mruby/boxing_no.h @@ -10,15 +10,17 @@ #define MRB_FIXNUM_SHIFT 0 #define MRB_TT_HAS_BASIC MRB_TT_OBJECT -typedef struct mrb_value { - union { +union mrb_value_value { #ifndef MRB_WITHOUT_FLOAT - mrb_float f; + mrb_float f; #endif - void *p; - mrb_int i; - mrb_sym sym; - } value; + void *p; + mrb_int i; + mrb_sym sym; +}; + +typedef struct mrb_value { + union mrb_value_value value; enum mrb_vtype tt; } mrb_value; diff --git a/include/mruby/error.h b/include/mruby/error.h index b795bdf4c..5aa8bbda9 100644 --- a/include/mruby/error.h +++ b/include/mruby/error.h @@ -32,11 +32,39 @@ MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_va /* declaration for `fail` method */ MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value); +#if defined(MRB_64BIT) || defined(MRB_USE_FLOAT) || defined(MRB_NAN_BOXING) || defined(MRB_WORD_BOXING) struct RBreak { MRB_OBJECT_HEADER; struct RProc *proc; mrb_value val; }; +#define mrb_break_value_get(brk) ((brk)->val) +#define mrb_break_value_set(brk, v) ((brk)->val = v) +#else +struct RBreak { + MRB_OBJECT_HEADER; + struct RProc *proc; + union mrb_value_value val_val; +}; +#define RBREAK_VALUE_TT_MASK ((1 << 8) - 1) +static inline mrb_value +mrb_break_value_get(struct RBreak *brk) +{ + mrb_value val; + val.value = brk->val_val; + val.tt = brk->flags & RBREAK_VALUE_TT_MASK; + return val; +} +static inline void +mrb_break_value_set(struct RBreak *brk, mrb_value val) +{ + brk->val_val = val.value; + brk->flags &= ~RBREAK_VALUE_TT_MASK; + brk->flags |= val.tt; +} +#endif /* MRB_64BIT || MRB_USE_FLOAT || MRB_NAN_BOXING || MRB_WORD_BOXING */ +#define mrb_break_proc_get(brk) ((brk)->proc) +#define mrb_break_proc_set(brk, p) ((brk)->proc = p) /** * Protect |
