aboutsummaryrefslogtreecommitdiffstats
path: root/process.c
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-11-22 10:27:46 +0100
committerJean Boussier <jean.boussier@gmail.com>2023-11-22 13:04:21 +0100
commit9ae6ee5a59e74e629f73222938b53a6eae8d2ded (patch)
treed9a59c2ab4af56719727863ae77b9de075658a8f /process.c
parentcdc578ee008775e022f63fc9d567c92c59202505 (diff)
downloadruby-9ae6ee5a59e74e629f73222938b53a6eae8d2ded.tar.gz
Embed exec_arg objects
They are very ephemeral, so avoiding the malloc churn is desirable.
Diffstat (limited to 'process.c')
-rw-r--r--process.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/process.c b/process.c
index aa213ba53c..4dc2325f80 100644
--- a/process.c
+++ b/process.c
@@ -1836,7 +1836,7 @@ memsize_exec_arg(const void *ptr)
static const rb_data_type_t exec_arg_data_type = {
"exec_arg",
{mark_exec_arg, RUBY_TYPED_DEFAULT_FREE, memsize_exec_arg},
- 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_EMBEDDABLE
};
#ifdef _WIN32
@@ -2780,6 +2780,7 @@ rb_execarg_setenv(VALUE execarg_obj, VALUE env)
struct rb_execarg *eargp = rb_execarg_get(execarg_obj);
env = !NIL_P(env) ? rb_check_exec_env(env, &eargp->path_env) : Qfalse;
eargp->env_modification = env;
+ RB_GC_GUARD(execarg_obj);
}
static int
@@ -2977,6 +2978,7 @@ execarg_parent_end(VALUE execarg_obj)
}
errno = err;
+ RB_GC_GUARD(execarg_obj);
return execarg_obj;
}
@@ -4668,7 +4670,7 @@ do_spawn_process(VALUE arg)
rb_execarg_parent_start1(argp->execarg);
- return (VALUE)rb_spawn_process(DATA_PTR(argp->execarg),
+ return (VALUE)rb_spawn_process(rb_execarg_get(argp->execarg),
argp->errmsg.ptr, argp->errmsg.buflen);
}