diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-05-14 03:30:03 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-05-14 03:30:03 +0000 |
commit | 4f3c4c7d6d2ab8bf81b5e2a26ba844a6727589fc (patch) | |
tree | 8f7d5223a8e8c2c7ef213d5c8fddd2b69e23a9bc /internal.h | |
parent | 8b88f70a842009d88feb6d46c4015ba9f15585c0 (diff) |
RSTRING_PTR is not guaranteed to be char*-aligned
This commit eliminates (char **)RSTRING_PTR(...) like usages.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63414 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'internal.h')
-rw-r--r-- | internal.h | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/internal.h b/internal.h index a3b952e021..b6b8839978 100644 --- a/internal.h +++ b/internal.h @@ -964,6 +964,24 @@ VALUE rb_imemo_tmpbuf_auto_free_pointer(void *buf); VALUE rb_imemo_tmpbuf_auto_free_maybe_mark_buffer(void *buf, size_t cnt); rb_imemo_tmpbuf_t *rb_imemo_tmpbuf_parser_heap(void *buf, rb_imemo_tmpbuf_t *old_heap, size_t cnt); +#define RB_IMEMO_TMPBUF_PTR(v) \ + ((void *)(((const struct rb_imemo_tmpbuf_struct *)(v))->ptr)) + +static inline VALUE +rb_imemo_tmpbuf_auto_free_pointer_new_from_an_RString(VALUE str) +{ + const void *src; + void *dst; + size_t len; + + SafeStringValue(str); + len = RSTRING_LEN(str); + src = RSTRING_PTR(str); + dst = ruby_xmalloc(len); + memcpy(dst, src, len); + return rb_imemo_tmpbuf_auto_free_pointer(dst); +} + void rb_strterm_mark(VALUE obj); /*! MEMO @@ -1679,8 +1697,17 @@ struct rb_execarg { * The beginning one is for /bin/sh used by exec_with_sh. * The last one for terminating NULL used by execve. * See rb_exec_fillarg() in process.c. */ -#define ARGVSTR2ARGC(argv_str) (RSTRING_LEN(argv_str) / sizeof(char *) - 2) -#define ARGVSTR2ARGV(argv_str) ((char **)RSTRING_PTR(argv_str) + 1) +#define ARGVSTR2ARGV(argv_str) ((char **)RB_IMEMO_TMPBUF_PTR(argv_str) + 1) + +static inline size_t +ARGVSTR2ARGC(VALUE argv_str) +{ + size_t i = 0; + char *const *p = ARGVSTR2ARGV(argv_str); + while (p[i++]) + ; + return i - 1; +} rb_pid_t rb_fork_ruby(int *status); void rb_last_status_clear(void); |