diff --git a/ChangeLog b/ChangeLog index bb4c1e70bb26dc..4d9806878b5872 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,3 @@ -Thu Oct 29 14:07:54 2015 Koichi Sasada - - * gc.c (gc_mark_ptr): remove debug code for #11244. - Thu Oct 29 10:08:33 2015 Eric Wong * variable.c (struct autoload_state): usable as wait-queue head diff --git a/dir.c b/dir.c index 290ca724294499..59057b4908c394 100644 --- a/dir.c +++ b/dir.c @@ -674,7 +674,7 @@ dir_path(VALUE dir) static int fundamental_encoding_p(rb_encoding *enc) { - switch (enc_to_index(enc)) { + switch (rb_enc_to_index(enc)) { case ENCINDEX_ASCII: case ENCINDEX_US_ASCII: case ENCINDEX_UTF_8: @@ -1010,7 +1010,7 @@ rb_dir_getwd(void) { char *path; VALUE cwd; - int fsenc = enc_to_index(rb_filesystem_encoding()); + int fsenc = rb_enc_to_index(rb_filesystem_encoding()); if (fsenc == ENCINDEX_US_ASCII) fsenc = ENCINDEX_ASCII; path = my_getcwd(); @@ -2139,9 +2139,9 @@ push_glob(VALUE ary, VALUE str, int flags) #ifdef __APPLE__ str = rb_str_encode_ospath(str); #endif - if (enc_to_index(enc) == ENCINDEX_US_ASCII) + if (rb_enc_to_index(enc) == ENCINDEX_US_ASCII) enc = rb_filesystem_encoding(); - if (enc_to_index(enc) == ENCINDEX_US_ASCII) + if (rb_enc_to_index(enc) == ENCINDEX_US_ASCII) enc = rb_ascii8bit_encoding(); flags |= GLOB_VERBOSE; args.glob.func = push_pattern; diff --git a/encindex.h b/encindex.h index 0527259c279c1e..dcb1646f3a9655 100644 --- a/encindex.h +++ b/encindex.h @@ -57,28 +57,6 @@ enum ruby_preserved_encindex { #define rb_utf8_encindex() RUBY_ENCINDEX_UTF_8 #define rb_usascii_encindex() RUBY_ENCINDEX_US_ASCII -#ifdef RUBY_ENCODING_H -#define ENC_INDEX_MASK (~(~0U<<24)) -#define ENC_TO_ENCINDEX(enc) (int)((enc)->ruby_encoding_index & ENC_INDEX_MASK) - -static inline int -enc_to_index(rb_encoding *enc) -{ - return enc ? ENC_TO_ENCINDEX(enc) : 0; -} - -static inline int -str_enc_get_index(VALUE str) -{ - int i = ENCODING_GET_INLINED(str); - if (i == ENCODING_INLINE_MAX) { - VALUE iv = rb_ivar_get(str, rb_id_encoding()); - i = NUM2INT(iv); - } - return i; -} -#endif - #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ diff --git a/encoding.c b/encoding.c index 0444b5fccbb741..57c89ee8ce2fe0 100644 --- a/encoding.c +++ b/encoding.c @@ -52,7 +52,9 @@ static struct { } enc_table; #define ENC_DUMMY_FLAG (1<<24) +#define ENC_INDEX_MASK (~(~0U<<24)) +#define ENC_TO_ENCINDEX(enc) (int)((enc)->ruby_encoding_index & ENC_INDEX_MASK) #define ENC_DUMMY_P(enc) ((enc)->ruby_encoding_index & ENC_DUMMY_FLAG) #define ENC_SET_DUMMY(enc) ((enc)->ruby_encoding_index |= ENC_DUMMY_FLAG) @@ -110,7 +112,7 @@ rb_enc_from_encoding(rb_encoding *encoding) int rb_enc_to_index(rb_encoding *enc) { - return enc_to_index(enc); + return enc ? ENC_TO_ENCINDEX(enc) : 0; } int @@ -756,7 +758,13 @@ rb_enc_get_index(VALUE obj) default: case T_STRING: case T_REGEXP: - i = str_enc_get_index(obj); + i = ENCODING_GET_INLINED(obj); + if (i == ENCODING_INLINE_MAX) { + VALUE iv; + + iv = rb_ivar_get(obj, rb_id_encoding()); + i = NUM2INT(iv); + } break; case T_FILE: tmp = rb_funcallv(obj, rb_intern("internal_encoding"), 0, 0); diff --git a/gc.c b/gc.c index bdab8d8f4c0050..4e9df0cd68b88c 100644 --- a/gc.c +++ b/gc.c @@ -4235,6 +4235,17 @@ static void gc_mark_ptr(rb_objspace_t *objspace, VALUE obj) { if (LIKELY(objspace->mark_func_data == NULL)) { + /* check code for Bug #11244 */ + if (BUILTIN_TYPE(obj) == T_NONE) { + if (objspace->rgengc.parent_object) { + rb_bug("gc_mark_ptr: obj is %s (parent: %s)", obj_info(obj), + obj_info(objspace->rgengc.parent_object)); + } + else { + rb_bug("gc_mark_ptr: obj is %s (parent is not old)", obj_info(obj)); + } + } + rgengc_check_relation(objspace, obj); if (!gc_mark_set(objspace, obj)) return; /* already marked */ gc_aging(objspace, obj); diff --git a/string.c b/string.c index 7c179d3cce5532..eb16998c0a18cd 100644 --- a/string.c +++ b/string.c @@ -1617,7 +1617,7 @@ rb_str_plus(VALUE str1, VALUE str2) TERM_FILL(&ptr3[len1+len2], rb_enc_mbminlen(enc)); FL_SET_RAW(str3, OBJ_TAINTED_RAW(str1) | OBJ_TAINTED_RAW(str2)); - ENCODING_CODERANGE_SET(str3, enc_to_index(enc), + ENCODING_CODERANGE_SET(str3, rb_enc_to_index(enc), ENC_CODERANGE_AND(ENC_CODERANGE(str1), ENC_CODERANGE(str2))); RB_GC_GUARD(str1); RB_GC_GUARD(str2);