8000 bugfix. when splat array argument and keyword argument were used toge… · mrubyc/mrubyc@f2526c7 · GitHub
[go: up one dir, main page]

Skip to content

Commit f2526c7

Browse files
bugfix. when splat array argument and keyword argument were used together, sometimes unnecessary memory copies were performed.
1 parent 6acf169 commit f2526c7

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/vm.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,20 @@ static void send_by_name( struct VM *vm, mrbc_sym sym_id, int a, int c )
5353
{
5454
int narg = c & 0x0f;
5555
int karg = (c >> 4) & 0x0f;
56+
int have_block = (c >> 8);
5657
mrbc_value *recv = vm->cur_regs + a;
5758

5859
// If it's packed in an array, expand it.
5960
if( narg == CALL_MAXARGS ) {
6061
mrbc_value argv = recv[1];
62+
int n_move = (karg == CALL_MAXARGS) ? 2 : karg * 2 + 1;
63+
6164
narg = mrbc_array_size(&argv);
6265
for( int i = 0; i < narg; i++ ) {
6366
mrbc_incref( &argv.array->data[i] );
6467
}
6568

66-
memmove( recv + narg + 1, recv + 2, sizeof(mrbc_value) * (karg * 2 + 1) );
69+
memmove( recv + narg + 1, recv + 2, sizeof(mrbc_value) * n_move );
6770
memcpy( recv + 1, argv.array->data, sizeof(mrbc_value) * narg );
6871

6972
mrbc_decref(&argv);
@@ -88,7 +91,7 @@ static void send_by_name( struct VM *vm, mrbc_sym sym_id, int a, int c )
8891
}
8992

9093
// is not have block
91-
if( (c >> 8) == 0 ) {
94+
if( !have_block ) {
9295
mrbc_decref( recv + narg + 1 );
9396
mrbc_set_nil( recv + narg + 1 );
9497
}

0 commit comments

Comments
 (0)
0