1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* include/ruby/ruby.h: constify RArray::as::ary and RArray::heap::ptr.

Use RARRAY_ASET() or RARRAY_PTR_USE() to modify Array objects.
* array.c, gc.c: catch up above changes.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41537 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2013-06-21 11:53:33 +00:00
parent c2269d9aad
commit 508b255b9a
4 changed files with 23 additions and 16 deletions

View file

@ -1,3 +1,10 @@
Fri Jun 21 20:50:32 2013 Koichi Sasada <ko1@atdot.net>
* include/ruby/ruby.h: constify RArray::as::ary and RArray::heap::ptr.
Use RARRAY_ASET() or RARRAY_PTR_USE() to modify Array objects.
* array.c, gc.c: catch up above changes.
Fri Jun 21 20:32:13 2013 Koichi Sasada <ko1@atdot.net> Fri Jun 21 20:32:13 2013 Koichi Sasada <ko1@atdot.net>
* vm_eval.c (eval_string_with_cref): fix WB miss. * vm_eval.c (eval_string_with_cref): fix WB miss.

20
array.c
View file

@ -170,7 +170,7 @@ ary_resize_capa(VALUE ary, long capacity)
long len = RARRAY_LEN(ary); long len = RARRAY_LEN(ary);
VALUE *ptr = RARRAY_PTR(ary); VALUE *ptr = RARRAY_PTR(ary);
if (len > capacity) len = capacity; if (len > capacity) len = capacity;
MEMCPY(RARRAY(ary)->as.ary, ptr, VALUE, len); MEMCPY((VALUE *)RARRAY(ary)->as.ary, ptr, VALUE, len);
FL_SET_EMBED(ary); FL_SET_EMBED(ary);
ARY_SET_LEN(ary, len); ARY_SET_LEN(ary, len);
xfree(ptr); xfree(ptr);
@ -267,10 +267,10 @@ rb_ary_modify(VALUE ary)
long len = RARRAY_LEN(ary); long len = RARRAY_LEN(ary);
VALUE shared = ARY_SHARED(ary); VALUE shared = ARY_SHARED(ary);
if (len <= RARRAY_EMBED_LEN_MAX) { if (len <= RARRAY_EMBED_LEN_MAX) {
VALUE *ptr = ARY_HEAP_PTR(ary); const VALUE *ptr = ARY_HEAP_PTR(ary);
FL_UNSET_SHARED(ary); FL_UNSET_SHARED(ary);
FL_SET_EMBED(ary); FL_SET_EMBED(ary);
MEMCPY(ARY_EMBED_PTR(ary), ptr, VALUE, len); MEMCPY((VALUE *)ARY_EMBED_PTR(ary), ptr, VALUE, len);
rb_ary_decrement_share(shared); rb_ary_decrement_share(shared);
ARY_SET_EMBED_LEN(ary, len); ARY_SET_EMBED_LEN(ary, len);
} }
@ -484,7 +484,7 @@ void
rb_ary_free(VALUE ary) rb_ary_free(VALUE ary)
{ {
if (ARY_OWNS_HEAP_P(ary)) { if (ARY_OWNS_HEAP_P(ary)) {
xfree(ARY_HEAP_PTR(ary)); xfree((void *)ARY_HEAP_PTR(ary));
} }
} }
@ -545,7 +545,7 @@ ary_make_substitution(VALUE ary)
{ {
if (RARRAY_LEN(ary) <= RARRAY_EMBED_LEN_MAX) { if (RARRAY_LEN(ary) <= RARRAY_EMBED_LEN_MAX) {
VALUE subst = rb_ary_new2(RARRAY_LEN(ary)); VALUE subst = rb_ary_new2(RARRAY_LEN(ary));
MEMCPY(ARY_EMBED_PTR(subst), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary)); MEMCPY((VALUE *)ARY_EMBED_PTR(subst), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
ARY_SET_EMBED_LEN(subst, RARRAY_LEN(ary)); ARY_SET_EMBED_LEN(subst, RARRAY_LEN(ary));
return subst; return subst;
} }
@ -662,7 +662,7 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
rb_ary_modify(ary); rb_ary_modify(ary);
if (argc == 0) { if (argc == 0) {
if (ARY_OWNS_HEAP_P(ary) && RARRAY_RAWPTR(ary) != 0) { if (ARY_OWNS_HEAP_P(ary) && RARRAY_RAWPTR(ary) != 0) {
xfree(RARRAY_RAWPTR(ary)); xfree((void *)RARRAY_RAWPTR(ary));
} }
rb_ary_unshare_safe(ary); rb_ary_unshare_safe(ary);
FL_SET_EMBED(ary); FL_SET_EMBED(ary);
@ -703,7 +703,7 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
} }
else { else {
RARRAY_PTR_USE(ary, ptr, { RARRAY_PTR_USE(ary, ptr, {
memfill(ptr, len, val); memfill((VALUE *)ptr, len, val);
}); });
OBJ_WRITTEN(ary, Qundef, val); OBJ_WRITTEN(ary, Qundef, val);
ARY_SET_LEN(ary, len); ARY_SET_LEN(ary, len);
@ -769,7 +769,7 @@ ary_make_partial(VALUE ary, VALUE klass, long offset, long len)
if (len <= RARRAY_EMBED_LEN_MAX) { if (len <= RARRAY_EMBED_LEN_MAX) {
VALUE result = ary_alloc(klass); VALUE result = ary_alloc(klass);
MEMCPY(ARY_EMBED_PTR(result), RARRAY_PTR(ary) + offset, VALUE, len); MEMCPY((VALUE *)ARY_EMBED_PTR(result), RARRAY_PTR(ary) + offset, VALUE, len);
ARY_SET_EMBED_LEN(result, len); ARY_SET_EMBED_LEN(result, len);
return result; return result;
} }
@ -1551,7 +1551,7 @@ rb_ary_resize(VALUE ary, long len)
VALUE tmp[RARRAY_EMBED_LEN_MAX]; VALUE tmp[RARRAY_EMBED_LEN_MAX];
MEMCPY(tmp, ARY_HEAP_PTR(ary), VALUE, len); MEMCPY(tmp, ARY_HEAP_PTR(ary), VALUE, len);
ary_discard(ary); ary_discard(ary);
MEMCPY(ARY_EMBED_PTR(ary), tmp, VALUE, len); MEMCPY((VALUE *)ARY_EMBED_PTR(ary), tmp, VALUE, len);
ARY_SET_EMBED_LEN(ary, len); ARY_SET_EMBED_LEN(ary, len);
} }
else { else {
@ -2335,7 +2335,7 @@ rb_ary_sort_bang(VALUE ary)
rb_ary_unshare(ary); rb_ary_unshare(ary);
} }
else { else {
xfree(ARY_HEAP_PTR(ary)); xfree((void *)ARY_HEAP_PTR(ary));
} }
ARY_SET_PTR(ary, RARRAY_PTR(tmp)); ARY_SET_PTR(ary, RARRAY_PTR(tmp));
ARY_SET_HEAP_LEN(ary, len); ARY_SET_HEAP_LEN(ary, len);

2
gc.c
View file

@ -3306,7 +3306,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
} }
else { else {
long i, len = RARRAY_LEN(obj); long i, len = RARRAY_LEN(obj);
VALUE *ptr = RARRAY_RAWPTR(obj); const VALUE *ptr = RARRAY_RAWPTR(obj);
for (i=0; i < len; i++) { for (i=0; i < len; i++) {
gc_mark(objspace, *ptr++); gc_mark(objspace, *ptr++);
} }

View file

@ -933,9 +933,9 @@ struct RArray {
long capa; long capa;
VALUE shared; VALUE shared;
} aux; } aux;
VALUE *ptr; const VALUE *ptr;
} heap; } heap;
VALUE ary[RARRAY_EMBED_LEN_MAX]; const VALUE ary[RARRAY_EMBED_LEN_MAX];
} as; } as;
}; };
#define RARRAY_EMBED_FLAG FL_USER1 #define RARRAY_EMBED_FLAG FL_USER1
@ -961,7 +961,7 @@ struct RArray {
#define RARRAY_PTR_USE(ary, ptr_name, expr) do { \ #define RARRAY_PTR_USE(ary, ptr_name, expr) do { \
const VALUE _ary = (ary); \ const VALUE _ary = (ary); \
VALUE *ptr_name = RARRAY_PTR_USE_START(_ary); \ VALUE *ptr_name = (VALUE *)RARRAY_PTR_USE_START(_ary); \
expr; \ expr; \
RARRAY_PTR_USE_END(_ary); \ RARRAY_PTR_USE_END(_ary); \
} while (0) } while (0)
@ -969,10 +969,10 @@ struct RArray {
#define RARRAY_AREF(a, i) (RARRAY_RAWPTR(a)[i]) #define RARRAY_AREF(a, i) (RARRAY_RAWPTR(a)[i])
#define RARRAY_ASET(a, i, v) do { \ #define RARRAY_ASET(a, i, v) do { \
const VALUE _ary_ = (a); \ const VALUE _ary_ = (a); \
OBJ_WRITE(_ary_, &RARRAY_RAWPTR(_ary_)[i], (v)); \ OBJ_WRITE(_ary_, (VALUE *)&RARRAY_RAWPTR(_ary_)[i], (v)); \
} while (0) } while (0)
#define RARRAY_PTR(a) RARRAY_RAWPTR(RGENGC_WB_PROTECTED_ARRAY ? OBJ_WB_GIVEUP((VALUE)a) : ((VALUE)a)) #define RARRAY_PTR(a) ((VALUE *)RARRAY_RAWPTR(RGENGC_WB_PROTECTED_ARRAY ? OBJ_WB_GIVEUP((VALUE)a) : ((VALUE)a)))
struct RRegexp { struct RRegexp {
struct RBasic basic; struct RBasic basic;