зеркало из https://github.com/github/ruby.git
exclude non-VALUE in memo from GC
* internal.h (NEW_PARTIAL_MEMO_FOR): shrink buffer array not to mark non-VALUE fields. fix check_rvalue_consistency abort with RGENGC_CHECK_MODE=2. * internal.h (NEW_CMP_OPT_MEMO): exclude struct cmp_opt_data from the valid array range. * enum.c (slicewhen_i): exclude inverted too. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55079 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
c06a990806
Коммит
b7733bf6c5
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
Fri May 20 19:48:48 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* internal.h (NEW_PARTIAL_MEMO_FOR): shrink buffer array not to
|
||||
mark non-VALUE fields. fix check_rvalue_consistency abort with
|
||||
RGENGC_CHECK_MODE=2.
|
||||
|
||||
* internal.h (NEW_CMP_OPT_MEMO): exclude struct cmp_opt_data from
|
||||
the valid array range.
|
||||
|
||||
* enum.c (slicewhen_i): exclude inverted too.
|
||||
|
||||
Thu May 19 21:21:57 2016 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
|
||||
|
||||
* re.c (rb_reg_match_m_p): [DOC] fix return value in rdoc.
|
||||
|
|
9
enum.c
9
enum.c
|
@ -1563,7 +1563,7 @@ static VALUE
|
|||
enum_min(int argc, VALUE *argv, VALUE obj)
|
||||
{
|
||||
VALUE memo;
|
||||
struct min_t *m = NEW_MEMO_FOR(struct min_t, memo);
|
||||
struct min_t *m = NEW_CMP_OPT_MEMO(struct min_t, memo);
|
||||
VALUE result;
|
||||
VALUE num;
|
||||
|
||||
|
@ -1656,7 +1656,7 @@ static VALUE
|
|||
enum_max(int argc, VALUE *argv, VALUE obj)
|
||||
{
|
||||
VALUE memo;
|
||||
struct max_t *m = NEW_MEMO_FOR(struct max_t, memo);
|
||||
struct max_t *m = NEW_CMP_OPT_MEMO(struct max_t, memo);
|
||||
VALUE result;
|
||||
VALUE num;
|
||||
|
||||
|
@ -1809,7 +1809,7 @@ static VALUE
|
|||
enum_minmax(VALUE obj)
|
||||
{
|
||||
VALUE memo;
|
||||
struct minmax_t *m = NEW_MEMO_FOR(struct minmax_t, memo);
|
||||
struct minmax_t *m = NEW_CMP_OPT_MEMO(struct minmax_t, memo);
|
||||
|
||||
m->min = Qundef;
|
||||
m->last = Qundef;
|
||||
|
@ -3406,7 +3406,8 @@ slicewhen_i(RB_BLOCK_CALL_FUNC_ARGLIST(yielder, enumerator))
|
|||
{
|
||||
VALUE enumerable;
|
||||
VALUE arg;
|
||||
struct slicewhen_arg *memo = NEW_MEMO_FOR(struct slicewhen_arg, arg);
|
||||
struct slicewhen_arg *memo =
|
||||
NEW_PARTIAL_MEMO_FOR(struct slicewhen_arg, arg, inverted);
|
||||
|
||||
enumerable = rb_ivar_get(enumerator, rb_intern("slicewhen_enum"));
|
||||
memo->pred = rb_attr_get(enumerator, rb_intern("slicewhen_pred"));
|
||||
|
|
|
@ -773,6 +773,10 @@ struct MEMO {
|
|||
#define MEMO_FOR(type, value) ((type *)RARRAY_PTR(value))
|
||||
#define NEW_MEMO_FOR(type, value) \
|
||||
((value) = rb_ary_tmp_new_fill(type_roomof(type, VALUE)), MEMO_FOR(type, value))
|
||||
#define NEW_PARTIAL_MEMO_FOR(type, value, member) \
|
||||
((value) = rb_ary_tmp_new_fill(type_roomof(type, VALUE)), \
|
||||
rb_ary_set_len((value), offsetof(type, member) / sizeof(VALUE)), \
|
||||
MEMO_FOR(type, value))
|
||||
|
||||
#define STRING_P(s) (RB_TYPE_P((s), T_STRING) && CLASS_OF(s) == rb_cString)
|
||||
|
||||
|
@ -787,6 +791,8 @@ struct cmp_opt_data {
|
|||
int opt_inited;
|
||||
};
|
||||
|
||||
#define NEW_CMP_OPT_MEMO(type, value) \
|
||||
NEW_PARTIAL_MEMO_FOR(type, value, cmp_opt)
|
||||
#define CMP_OPTIMIZABLE_BIT(type) (1U << TOKEN_PASTE(cmp_opt_,type))
|
||||
#define CMP_OPTIMIZABLE(data, type) \
|
||||
(((data).opt_inited & CMP_OPTIMIZABLE_BIT(type)) ? \
|
||||
|
|
Загрузка…
Ссылка в новой задаче