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

capa should be even number on 64-bit SPARC for 8-byte word alignment

* id_table.c (list_id_table_init): When unaligned word access is
  prohibited and sizeof(VALUE) is 8 (64-bit machines),
  capa should always be even number for 8-byte word alignment
  of the values of a table. This code assumes that sizeof(ID) is 4,
  sizeof(VALUE) is 8, and xmalloc() returns 8-byte aligned memory.
  This fixes bus error on 64-bit SPARC Solaris 10.
  [Bug #12406][ruby-dev:49631]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ngoto 2016-05-20 14:55:23 +00:00
parent a716a2474b
commit 02cafdf491
2 changed files with 18 additions and 0 deletions

View file

@ -1,3 +1,13 @@
Fri May 20 23:45:53 2016 Naohisa Goto <ngotogenome@gmail.com>
* id_table.c (list_id_table_init): When unaligned word access is
prohibited and sizeof(VALUE) is 8 (64-bit machines),
capa should always be even number for 8-byte word alignment
of the values of a table. This code assumes that sizeof(ID) is 4,
sizeof(VALUE) is 8, and xmalloc() returns 8-byte aligned memory.
This fixes bus error on 64-bit SPARC Solaris 10.
[Bug #12406][ruby-dev:49631]
Fri May 20 22:30:09 2016 Naohisa Goto <ngotogenome@gmail.com>
* symbol.h (rb_id2sym): Use HAVE_BUILTIN___BUILTIN_CONSTANT_P

View file

@ -379,6 +379,14 @@ static struct list_id_table *
list_id_table_init(struct list_id_table *tbl, size_t capa)
{
if (capa > 0) {
#if ID_TABLE_USE_CALC_VALUES && \
(UNALIGNED_WORD_ACCESS == 0) && (SIZEOF_VALUE == 8)
/* Workaround for 8-byte word alignment on 64-bit SPARC.
* This code assumes that sizeof(ID) == 4, sizeof(VALUE) == 8, and
* xmalloc() returns 8-byte aligned memory block.
*/
if (capa & (size_t)1) capa += 1;
#endif
tbl->capa = (int)capa;
#if ID_TABLE_USE_CALC_VALUES
tbl->keys = (id_key_t *)xmalloc(sizeof(id_key_t) * capa + sizeof(VALUE) * capa);