diff options
| author | dearblue <[email protected]> | 2020-04-13 22:32:16 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2020-04-13 23:12:09 +0900 |
| commit | d0501c69b0892208309dcbb8aa7fc1b8d75f3c8e (patch) | |
| tree | 908f7e312e39419524496547e71070ac462ca11c /src | |
| parent | 63c7ff341a53a689209e67f9f1c885fcff596cf8 (diff) | |
| download | mruby-d0501c69b0892208309dcbb8aa7fc1b8d75f3c8e.tar.gz mruby-d0501c69b0892208309dcbb8aa7fc1b8d75f3c8e.zip | |
Fix `MRB_TT_CPTR` object with `MRB_NAN_BOXING`
Previously, if `MRB_NAN_BOXING` is defined, for example,
`mrb_cptr_value()` could not keep an odd address.
If it is `MRB_32BIT`, it can be embedded in `NaN` as it is.
If it is `MRB_64BIT`, some operations are shared with `MRB_WORD_BOXING`.
In this case, the MRB_API function `mrb_nan_boxing_cptr_value()` is
defined.
Diffstat (limited to 'src')
| -rw-r--r-- | src/etc.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -140,7 +140,13 @@ mrb_obj_id(mrb_value obj) } } +#if defined(MRB_NAN_BOXING) && defined(MRB_64BIT) +#define mrb_xxx_boxing_cptr_value mrb_nan_boxing_cptr_value +#endif + #ifdef MRB_WORD_BOXING +#define mrb_xxx_boxing_cptr_value mrb_word_boxing_cptr_value + #ifndef MRB_WITHOUT_FLOAT MRB_API mrb_value mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f) @@ -164,17 +170,20 @@ mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f) return mrb_obj_value(nf); } #endif /* MRB_WITHOUT_FLOAT */ +#endif /* MRB_WORD_BOXING */ +#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT)) MRB_API mrb_value -mrb_word_boxing_cptr_value(mrb_state *mrb, void *p) +mrb_xxx_boxing_cptr_value(mrb_state *mrb, void *p) { mrb_value v; + struct RCptr *cptr = (struct RCptr*)mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class); - v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class); - v.value.vp->p = p; + SET_OBJ_VALUE(v, cptr); + cptr->p = p; return v; } -#endif /* MRB_WORD_BOXING */ +#endif #if defined _MSC_VER && _MSC_VER < 1900 |
