RSTRING_PTR is not guaranteed to be VALUE-aligned

Don't abuse struct RString to hold arbitrary memory region.
use rb_alloc_tmp_buffer for that purpose.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63362 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2018-05-09 02:36:34 +00:00
Родитель 6061071f40
Коммит 7079db9ec5
1 изменённых файлов: 7 добавлений и 5 удалений

12
iseq.h
Просмотреть файл

@ -46,23 +46,25 @@ ISEQ_FLIP_CNT_INCREMENT(const rb_iseq_t *iseq)
static inline VALUE *
ISEQ_ORIGINAL_ISEQ(const rb_iseq_t *iseq)
{
VALUE str = iseq->body->variable.original_iseq;
if (RTEST(str)) return (VALUE *)RSTRING_PTR(str);
rb_imemo_alloc_t *str = (void *)iseq->body->variable.original_iseq;
if (RTEST(str)) return str->ptr;
return NULL;
}
static inline void
ISEQ_ORIGINAL_ISEQ_CLEAR(const rb_iseq_t *iseq)
{
RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, Qnil);
rb_free_tmp_buffer(&iseq->body->variable.original_iseq);
RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, Qfalse);
}
static inline VALUE *
ISEQ_ORIGINAL_ISEQ_ALLOC(const rb_iseq_t *iseq, long size)
{
VALUE str = rb_str_tmp_new(size * sizeof(VALUE));
VALUE str;
VALUE *ptr = rb_alloc_tmp_buffer_with_count(&str, sizeof(VALUE), size);
RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, str);
return (VALUE *)RSTRING_PTR(str);
return ptr;
}
#define ISEQ_TRACE_EVENTS (RUBY_EVENT_LINE | \