diff --git a/include/mruby/array.h b/include/mruby/array.h index 47f643243..6e63db557 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -67,7 +67,7 @@ struct RArray { #define ARY_UNSET_EMBED_FLAG(a) (void)0 #define ARY_EMBED_LEN(a) 0 #define ARY_SET_EMBED_LEN(a,len) (void)0 -#define ARY_EMBED_PTR(a) 0 +#define ARY_EMBED_PTR(a) ((mrb_value*)NULL) #else #define MRB_ARY_EMBED_MASK 7 #define ARY_EMBED_P(a) ((a)->flags & MRB_ARY_EMBED_MASK) @@ -81,6 +81,7 @@ struct RArray { #define ARY_PTR(a) (ARY_EMBED_P(a)?ARY_EMBED_PTR(a):(a)->as.heap.ptr) #define RARRAY_LEN(a) ARY_LEN(RARRAY(a)) #define RARRAY_PTR(a) ARY_PTR(RARRAY(a)) +#define RARRAY_GETMEM(a, ptr, len) ARY_GETMEM(RARRAY(a), ptr, len) #define ARY_SET_LEN(a,n) do {\ if (ARY_EMBED_P(a)) {\ mrb_assert((n) <= MRB_ARY_EMBED_LEN_MAX); \ @@ -94,6 +95,17 @@ struct RArray { #define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED) #define ARY_SET_SHARED_FLAG(a) ((a)->flags |= MRB_ARY_SHARED) #define ARY_UNSET_SHARED_FLAG(a) ((a)->flags &= ~MRB_ARY_SHARED) +#define ARY_GETMEM(a, ptr, len) do { \ + struct RArray *MRB_UNIQNAME(_a_) = (a); \ + if (ARY_EMBED_P(MRB_UNIQNAME(_a_))) { \ + (len) = ARY_EMBED_LEN(MRB_UNIQNAME(_a_)); \ + (ptr) = ARY_EMBED_PTR(MRB_UNIQNAME(_a_)); \ + } \ + else { \ + (len) = MRB_UNIQNAME(_a_)->as.heap.len; \ + (ptr) = MRB_UNIQNAME(_a_)->as.heap.ptr; \ + } \ +} while (0) MRB_API void mrb_ary_modify(mrb_state*, struct RArray*); MRB_API mrb_value mrb_ary_dup(mrb_state*, mrb_value ary);