Embed exec_arg objects

They are very ephemeral, so avoiding the malloc churn
is desirable.
This commit is contained in:
Jean Boussier 2023-11-22 10:27:46 +01:00 committed by Jean Boussier
parent cdc578ee00
commit 9ae6ee5a59

View File

@ -1836,7 +1836,7 @@ memsize_exec_arg(const void *ptr)
static const rb_data_type_t exec_arg_data_type = { static const rb_data_type_t exec_arg_data_type = {
"exec_arg", "exec_arg",
{mark_exec_arg, RUBY_TYPED_DEFAULT_FREE, memsize_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 #ifdef _WIN32
@ -2780,6 +2780,7 @@ rb_execarg_setenv(VALUE execarg_obj, VALUE env)
struct rb_execarg *eargp = rb_execarg_get(execarg_obj); struct rb_execarg *eargp = rb_execarg_get(execarg_obj);
env = !NIL_P(env) ? rb_check_exec_env(env, &eargp->path_env) : Qfalse; env = !NIL_P(env) ? rb_check_exec_env(env, &eargp->path_env) : Qfalse;
eargp->env_modification = env; eargp->env_modification = env;
RB_GC_GUARD(execarg_obj);
} }
static int static int
@ -2977,6 +2978,7 @@ execarg_parent_end(VALUE execarg_obj)
} }
errno = err; errno = err;
RB_GC_GUARD(execarg_obj);
return execarg_obj; return execarg_obj;
} }
@ -4668,7 +4670,7 @@ do_spawn_process(VALUE arg)
rb_execarg_parent_start1(argp->execarg); 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); argp->errmsg.ptr, argp->errmsg.buflen);
} }