vm.c (env_alloc): inline to avoid extra zeroing
tiny speedup [ruby-core:64980] benchmark results: Execution time (sec) name trunk built app_lc_fizzbuzz 100.411 98.692 Speedup ratio: compare with the result of `trunk' (greater is better) name built app_lc_fizzbuzz 1.017 rb_proc_alloc changes will give more git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b41909f603
commit
ea6de7a2e2
@ -1,3 +1,8 @@
|
|||||||
|
Fri Sep 12 18:14:28 2014 Eric Wong <e@80x24.org>
|
||||||
|
|
||||||
|
* vm.c (env_alloc): inline to avoid extra zeroing
|
||||||
|
tiny speedup [ruby-core:64980]
|
||||||
|
|
||||||
Fri Sep 12 17:13:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Fri Sep 12 17:13:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* vm_method.c (rb_method_entry_make, remove_method): ditto.
|
* vm_method.c (rb_method_entry_make, remove_method): ditto.
|
||||||
|
30
vm.c
30
vm.c
@ -404,18 +404,6 @@ static const rb_data_type_t env_data_type = {
|
|||||||
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
||||||
};
|
};
|
||||||
|
|
||||||
static VALUE
|
|
||||||
env_alloc(int local_size)
|
|
||||||
{
|
|
||||||
rb_env_t *env;
|
|
||||||
|
|
||||||
env = xcalloc(1, sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
|
|
||||||
env->env_size = local_size + 1 + 1;
|
|
||||||
env->local_size = local_size;
|
|
||||||
|
|
||||||
return TypedData_Wrap_Struct(rb_cEnv, &env_data_type, env);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE check_env_value(VALUE envval);
|
static VALUE check_env_value(VALUE envval);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -488,10 +476,9 @@ vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* allocate env */
|
/* allocate env */
|
||||||
envval = env_alloc(local_size);
|
env = xmalloc(sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
|
||||||
GetEnvPtr(envval, env);
|
env->env_size = local_size + 1 + 1;
|
||||||
|
env->local_size = local_size;
|
||||||
env->prev_envval = penvval;
|
|
||||||
|
|
||||||
for (i = 0; i <= local_size; i++) {
|
for (i = 0; i <= local_size; i++) {
|
||||||
env->env[i] = envptr[-local_size + i];
|
env->env[i] = envptr[-local_size + i];
|
||||||
@ -504,6 +491,15 @@ vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* be careful not to trigger GC after this */
|
||||||
|
envval = TypedData_Wrap_Struct(rb_cEnv, &env_data_type, env);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* must happen after TypedData_Wrap_Struct to ensure penvval is markable
|
||||||
|
* in case object allocation triggers GC and clobbers penvval.
|
||||||
|
*/
|
||||||
|
env->prev_envval = penvval;
|
||||||
|
|
||||||
*envptr = envval; /* GC mark */
|
*envptr = envval; /* GC mark */
|
||||||
nenvptr = &env->env[i - 1];
|
nenvptr = &env->env[i - 1];
|
||||||
nenvptr[1] = envval; /* frame self */
|
nenvptr[1] = envval; /* frame self */
|
||||||
@ -513,8 +509,10 @@ vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
|
|||||||
|
|
||||||
/* as Binding */
|
/* as Binding */
|
||||||
env->block.self = cfp->self;
|
env->block.self = cfp->self;
|
||||||
|
env->block.klass = 0;
|
||||||
env->block.ep = cfp->ep;
|
env->block.ep = cfp->ep;
|
||||||
env->block.iseq = cfp->iseq;
|
env->block.iseq = cfp->iseq;
|
||||||
|
env->block.proc = 0;
|
||||||
|
|
||||||
if (!RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
if (!RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user