* insnhelper.ci (vm_callee_setup_arg, vm_send_optimize,
vm_yield_setup_args): bulk copy for arguments. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13095 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c2a41b3a71
commit
2d9512edd9
@ -1,3 +1,8 @@
|
|||||||
|
Sat Aug 18 14:35:00 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* insnhelper.ci (vm_callee_setup_arg, vm_send_optimize,
|
||||||
|
vm_yield_setup_args): bulk copy for arguments.
|
||||||
|
|
||||||
Sat Aug 18 13:55:58 2007 Koichi Sasada <ko1@atdot.net>
|
Sat Aug 18 13:55:58 2007 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* compile.c (iseq_compile_each): fix to allow self.x=
|
* compile.c (iseq_compile_each): fix to allow self.x=
|
||||||
|
@ -126,18 +126,14 @@ vm_callee_setup_arg(rb_thread_t *th, rb_iseq_t *iseq,
|
|||||||
|
|
||||||
/* post arguments */
|
/* post arguments */
|
||||||
if (iseq->arg_post_len) {
|
if (iseq->arg_post_len) {
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!(orig_argc < iseq->arg_post_start)) {
|
if (!(orig_argc < iseq->arg_post_start)) {
|
||||||
VALUE *new_argv = ALLOCA_N(VALUE, argc);
|
VALUE *new_argv = ALLOCA_N(VALUE, argc);
|
||||||
MEMCPY(new_argv, argv, VALUE, argc);
|
MEMCPY(new_argv, argv, VALUE, argc);
|
||||||
argv = new_argv;
|
argv = new_argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<iseq->arg_post_len; i++) {
|
MEMCPY(&dst[iseq->arg_post_start], &argv[argc -= iseq->arg_post_len],
|
||||||
dst[iseq->arg_post_start + iseq->arg_post_len - (i + 1)] = argv[argc - 1];
|
VALUE, iseq->arg_post_len);
|
||||||
argc--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* opt arguments */
|
/* opt arguments */
|
||||||
@ -589,13 +585,13 @@ vm_send_optimize(rb_control_frame_t *reg_cfp,
|
|||||||
extern VALUE rb_f_send(int argc, VALUE *argv, VALUE recv);
|
extern VALUE rb_f_send(int argc, VALUE *argv, VALUE recv);
|
||||||
|
|
||||||
if (node->nd_cfnc == rb_f_funcall || node->nd_cfnc == rb_f_send) {
|
if (node->nd_cfnc == rb_f_funcall || node->nd_cfnc == rb_f_send) {
|
||||||
int i;
|
int i = *num - 1;
|
||||||
VALUE sym = TOPN(*num - 1);
|
VALUE sym = TOPN(i);
|
||||||
*id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_to_id(sym);
|
*id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_to_id(sym);
|
||||||
|
|
||||||
/* shift arguments */
|
/* shift arguments */
|
||||||
for (i=*num-1; i>0; i--) {
|
if (i > 0) {
|
||||||
TOPN(i) = TOPN(i-1);
|
MEMCPY(&TOPN(i), &TOPN(i-1), VALUE, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
*mn = rb_method_node(klass, *id);
|
*mn = rb_method_node(klass, *id);
|
||||||
@ -697,9 +693,7 @@ vm_yield_setup_args(rb_thread_t *th, rb_iseq_t *iseq,
|
|||||||
|
|
||||||
CHECK_STACK_OVERFLOW(th->cfp, argc);
|
CHECK_STACK_OVERFLOW(th->cfp, argc);
|
||||||
|
|
||||||
for (i=0; i<argc; i++) {
|
MEMCPY(argv, RARRAY_PTR(ary), VALUE, argc);
|
||||||
argv[i] = RARRAY_PTR(ary)[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=argc; i<m; i++) {
|
for (i=argc; i<m; i++) {
|
||||||
@ -728,7 +722,7 @@ vm_yield_setup_args(rb_thread_t *th, rb_iseq_t *iseq,
|
|||||||
if (rsize < 0) rsize = 0;
|
if (rsize < 0) rsize = 0;
|
||||||
if (psize > len) psize = len;
|
if (psize > len) psize = len;
|
||||||
|
|
||||||
ary = rb_ary_new4(rsize, &argv[r]);
|
ary = rb_ary_new4(rsize - psize, &argv[r]);
|
||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
printf(" argc: %d\n", argc);
|
printf(" argc: %d\n", argc);
|
||||||
@ -738,11 +732,9 @@ vm_yield_setup_args(rb_thread_t *th, rb_iseq_t *iseq,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* copy post argument */
|
/* copy post argument */
|
||||||
for (i=0; i<psize; i++) {
|
MEMMOVE(&argv[start], &argv[r + rsize - psize], VALUE, psize);
|
||||||
argv[start + psize - i - 1] = rb_ary_pop(ary);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; i<len; i++) {
|
for (i=psize; i<len; i++) {
|
||||||
argv[start + i] = Qnil;
|
argv[start + i] = Qnil;
|
||||||
}
|
}
|
||||||
argv[r] = ary;
|
argv[r] = ary;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user