From 75d5cf55dea0c1351ebd37d432545935698c5c18 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 9 May 2018 05:42:06 +0000 Subject: RSTRING_PTR is not guaranteed to be VALUE-aligned (retry) Don't abuse struct RString to hold arbitrary memory region. Raw pointer should just suffice. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63368 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- iseq.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'iseq.h') diff --git a/iseq.h b/iseq.h index de8beff1ad..6789635de3 100644 --- a/iseq.h +++ b/iseq.h @@ -46,23 +46,24 @@ 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); - return NULL; + return iseq->body->variable.original_iseq; } static inline void ISEQ_ORIGINAL_ISEQ_CLEAR(const rb_iseq_t *iseq) { - RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, Qnil); + void *ptr = iseq->body->variable.original_iseq; + iseq->body->variable.original_iseq = NULL; + if (ptr) { + ruby_xfree(ptr); + } } static inline VALUE * ISEQ_ORIGINAL_ISEQ_ALLOC(const rb_iseq_t *iseq, long size) { - VALUE str = rb_str_tmp_new(size * sizeof(VALUE)); - RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, str); - return (VALUE *)RSTRING_PTR(str); + return iseq->body->variable.original_iseq = + ruby_xmalloc2(sizeof(VALUE), size); } #define ISEQ_TRACE_EVENTS (RUBY_EVENT_LINE | \ -- cgit v1.2.3