Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1/src/array.c
- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/src/array.c
r331 r439 10 10 #include <mruby/string.h> 11 11 #include <mruby/range.h> 12 #include <mruby/proc.h> 13 #include <mruby/opcode.h> 12 14 #include "value_array.h" 13 15 … … 15 17 #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ 16 18 #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value)) 17 #define ARY_MAX_SIZE (( ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1)19 #define ARY_MAX_SIZE ((mrb_int)((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? ARY_C_MAX_SIZE : MRB_INT_MAX-1)) 18 20 19 21 static struct RArray* … … 29 31 30 32 a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); 31 a->ptr = (mrb_value *)mrb_malloc(mrb, blen); 32 a->aux.capa = capa; 33 a->len = 0; 33 if (capa <= MRB_ARY_EMBED_LEN_MAX) { 34 ARY_SET_EMBED_LEN(a, 0); 35 } 36 else { 37 a->as.heap.ptr = (mrb_value *)mrb_malloc(mrb, blen); 38 a->as.heap.aux.capa = capa; 39 a->as.heap.len = 0; 40 } 34 41 35 42 return a; … … 73 80 } 74 81 82 static struct RArray* 83 ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals) 84 { 85 struct RArray *a = ary_new_capa(mrb, size); 86 87 array_copy(ARY_PTR(a), vals, size); 88 ARY_SET_LEN(a, size); 89 90 return a; 91 } 92 75 93 MRB_API mrb_value 76 94 mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals) 77 95 { 78 struct RArray *a = ary_new_capa(mrb, size); 79 80 array_copy(a->ptr, vals, size); 81 a->len = size; 82 96 struct RArray *a = ary_new_from_values(mrb, size, vals); 83 97 return mrb_obj_value(a); 84 98 } … … 90 104 91 105 a = ary_new_capa(mrb, 2); 92 a->ptr[0] = car;93 a->ptr[1] = cdr;94 a->len = 2;106 ARY_PTR(a)[0] = car; 107 ARY_PTR(a)[1] = cdr; 108 ARY_SET_LEN(a, 2); 95 109 return mrb_obj_value(a); 96 110 } … … 107 121 108 122 static void 123 ary_modify_check(mrb_state *mrb, struct RArray *a) 124 { 125 mrb_check_frozen(mrb, a); 126 } 127 128 static void 109 129 ary_modify(mrb_state *mrb, struct RArray *a) 110 130 { 111 if (MRB_FROZEN_P(a)) { 112 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen array"); 113 } 131 ary_modify_check(mrb, a); 114 132 115 133 if (ARY_SHARED_P(a)) { 116 mrb_shared_array *shared = a->a ux.shared;117 118 if (shared->refcnt == 1 && a-> ptr == shared->ptr) {119 a-> ptr = shared->ptr;120 a->a ux.capa = a->len;134 mrb_shared_array *shared = a->as.heap.aux.shared; 135 136 if (shared->refcnt == 1 && a->as.heap.ptr == shared->ptr) { 137 a->as.heap.ptr = shared->ptr; 138 a->as.heap.aux.capa = a->as.heap.len; 121 139 mrb_free(mrb, shared); 122 140 } … … 125 143 mrb_int len; 126 144 127 p = a-> ptr;128 len = a-> len * sizeof(mrb_value);145 p = a->as.heap.ptr; 146 len = a->as.heap.len * sizeof(mrb_value); 129 147 ptr = (mrb_value *)mrb_malloc(mrb, len); 130 148 if (p) { 131 array_copy(ptr, p, a-> len);149 array_copy(ptr, p, a->as.heap.len); 132 150 } 133 a-> ptr = ptr;134 a->a ux.capa = a->len;151 a->as.heap.ptr = ptr; 152 a->as.heap.aux.capa = a->as.heap.len; 135 153 mrb_ary_decref(mrb, shared); 136 154 } … … 149 167 ary_make_shared(mrb_state *mrb, struct RArray *a) 150 168 { 151 if (!ARY_SHARED_P(a) ) {169 if (!ARY_SHARED_P(a) && !ARY_EMBED_P(a)) { 152 170 mrb_shared_array *shared = (mrb_shared_array *)mrb_malloc(mrb, sizeof(mrb_shared_array)); 171 mrb_value *ptr = a->as.heap.ptr; 172 mrb_int len = a->as.heap.len; 153 173 154 174 shared->refcnt = 1; 155 if (a->a ux.capa > a->len) {156 a-> ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1);175 if (a->as.heap.aux.capa > len) { 176 a->as.heap.ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, ptr, sizeof(mrb_value)*len+1); 157 177 } 158 178 else { 159 shared->ptr = a->ptr;160 } 161 shared->len = a->len;162 a->a ux.shared = shared;179 shared->ptr = ptr; 180 } 181 shared->len = len; 182 a->as.heap.aux.shared = shared; 163 183 ARY_SET_SHARED_FLAG(a); 164 184 } … … 168 188 ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len) 169 189 { 170 mrb_int capa = a->aux.capa;171 172 if (len > ARY_MAX_SIZE ) {190 mrb_int capa = ARY_CAPA(a); 191 192 if (len > ARY_MAX_SIZE || len < 0) { 173 193 size_error: 174 194 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 175 195 } 176 196 177 if (capa == 0) {197 if (capa < ARY_DEFAULT_LEN) { 178 198 capa = ARY_DEFAULT_LEN; 179 199 } … … 190 210 } 191 211 192 if (capa > a->aux.capa) { 193 mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); 194 195 a->aux.capa = capa; 196 a->ptr = expanded_ptr; 212 if (ARY_EMBED_P(a)) { 213 mrb_value *ptr = ARY_EMBED_PTR(a); 214 mrb_int len = ARY_EMBED_LEN(a); 215 mrb_value *expanded_ptr = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*capa); 216 217 ARY_UNSET_EMBED_FLAG(a); 218 array_copy(expanded_ptr, ptr, len); 219 a->as.heap.len = len; 220 a->as.heap.aux.capa = capa; 221 a->as.heap.ptr = expanded_ptr; 222 } 223 else if (capa > a->as.heap.aux.capa) { 224 mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->as.heap.ptr, sizeof(mrb_value)*capa); 225 226 a->as.heap.aux.capa = capa; 227 a->as.heap.ptr = expanded_ptr; 197 228 } 198 229 } … … 201 232 ary_shrink_capa(mrb_state *mrb, struct RArray *a) 202 233 { 203 mrb_int capa = a->aux.capa; 204 234 235 mrb_int capa; 236 237 if (ARY_EMBED_P(a)) return; 238 239 capa = a->as.heap.aux.capa; 205 240 if (capa < ARY_DEFAULT_LEN * 2) return; 206 if (capa <= a-> len * ARY_SHRINK_RATIO) return;241 if (capa <= a->as.heap.len * ARY_SHRINK_RATIO) return; 207 242 208 243 do { … … 212 247 break; 213 248 } 214 } while (capa > a-> len * ARY_SHRINK_RATIO);215 216 if (capa > a-> len && capa < a->aux.capa) {217 a->a ux.capa = capa;218 a-> ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);249 } while (capa > a->as.heap.len * ARY_SHRINK_RATIO); 250 251 if (capa > a->as.heap.len && capa < a->as.heap.aux.capa) { 252 a->as.heap.aux.capa = capa; 253 a->as.heap.ptr = (mrb_value *)mrb_realloc(mrb, a->as.heap.ptr, sizeof(mrb_value)*capa); 219 254 } 220 255 } … … 229 264 old_len = RARRAY_LEN(ary); 230 265 if (old_len != new_len) { 231 a->len = new_len;232 266 if (new_len < old_len) { 233 267 ary_shrink_capa(mrb, a); … … 235 269 else { 236 270 ary_expand_capa(mrb, a, new_len); 237 ary_fill_with_nil(a->ptr + old_len, new_len - old_len); 238 } 271 ary_fill_with_nil(ARY_PTR(a) + old_len, new_len - old_len); 272 } 273 ARY_SET_LEN(a, new_len); 239 274 } 240 275 … … 250 285 struct RArray *a; 251 286 252 mrb_get_args(mrb, "* ", &vals, &len);287 mrb_get_args(mrb, "*!", &vals, &len); 253 288 ary = mrb_ary_new_from_values(mrb, len, vals); 254 289 a = mrb_ary_ptr(ary); … … 258 293 } 259 294 295 static void ary_replace(mrb_state*, struct RArray*, struct RArray*); 296 260 297 static void 261 298 ary_concat(mrb_state *mrb, struct RArray *a, struct RArray *a2) … … 263 300 mrb_int len; 264 301 265 if (a2->len > ARY_MAX_SIZE - a->len) { 302 if (ARY_LEN(a) == 0) { 303 ary_replace(mrb, a, a2); 304 return; 305 } 306 if (ARY_LEN(a2) > ARY_MAX_SIZE - ARY_LEN(a)) { 266 307 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 267 308 } 268 len = a->len + a2->len;309 len = ARY_LEN(a) + ARY_LEN(a2); 269 310 270 311 ary_modify(mrb, a); 271 if ( a->aux.capa< len) {312 if (ARY_CAPA(a) < len) { 272 313 ary_expand_capa(mrb, a, len); 273 314 } 274 array_copy( a->ptr+a->len, a2->ptr, a2->len);315 array_copy(ARY_PTR(a)+ARY_LEN(a), ARY_PTR(a2), ARY_LEN(a2)); 275 316 mrb_write_barrier(mrb, (struct RBasic*)a); 276 a->len = len;317 ARY_SET_LEN(a, len); 277 318 } 278 319 … … 301 342 struct RArray *a2; 302 343 mrb_value *ptr; 303 mrb_int blen ;344 mrb_int blen, len1; 304 345 305 346 mrb_get_args(mrb, "a", &ptr, &blen); 306 if (ARY_MAX_SIZE - blen < a1->len) {347 if (ARY_MAX_SIZE - blen < ARY_LEN(a1)) { 307 348 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 308 349 } 309 a2 = ary_new_capa(mrb, a1->len + blen); 310 array_copy(a2->ptr, a1->ptr, a1->len); 311 array_copy(a2->ptr + a1->len, ptr, blen); 312 a2->len = a1->len + blen; 350 len1 = ARY_LEN(a1); 351 a2 = ary_new_capa(mrb, len1 + blen); 352 array_copy(ARY_PTR(a2), ARY_PTR(a1), len1); 353 array_copy(ARY_PTR(a2) + len1, ptr, blen); 354 ARY_SET_LEN(a2, len1+blen); 313 355 314 356 return mrb_obj_value(a2); 315 357 } 316 358 359 #define ARY_REPLACE_SHARED_MIN 20 360 317 361 static void 318 ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, mrb_int len) 319 { 320 ary_modify(mrb, a); 321 if (a->aux.capa < len) 362 ary_replace(mrb_state *mrb, struct RArray *a, struct RArray *b) 363 { 364 mrb_int len = ARY_LEN(b); 365 366 ary_modify_check(mrb, a); 367 if (a == b) return; 368 if (ARY_SHARED_P(a)) { 369 mrb_ary_decref(mrb, a->as.heap.aux.shared); 370 a->as.heap.aux.capa = 0; 371 a->as.heap.len = 0; 372 a->as.heap.ptr = NULL; 373 ARY_UNSET_SHARED_FLAG(a); 374 } 375 if (ARY_SHARED_P(b)) { 376 shared_b: 377 if (ARY_EMBED_P(a)) { 378 ARY_UNSET_EMBED_FLAG(a); 379 } 380 else { 381 mrb_free(mrb, a->as.heap.ptr); 382 } 383 a->as.heap.ptr = b->as.heap.ptr; 384 a->as.heap.len = len; 385 a->as.heap.aux.shared = b->as.heap.aux.shared; 386 a->as.heap.aux.shared->refcnt++; 387 ARY_SET_SHARED_FLAG(a); 388 mrb_write_barrier(mrb, (struct RBasic*)a); 389 return; 390 } 391 if (!mrb_frozen_p(b) && len > ARY_REPLACE_SHARED_MIN) { 392 ary_make_shared(mrb, b); 393 goto shared_b; 394 } 395 if (ARY_CAPA(a) < len) 322 396 ary_expand_capa(mrb, a, len); 323 array_copy( a->ptr, argv, len);397 array_copy(ARY_PTR(a), ARY_PTR(b), len); 324 398 mrb_write_barrier(mrb, (struct RBasic*)a); 325 a->len = len;399 ARY_SET_LEN(a, len); 326 400 } 327 401 … … 333 407 334 408 if (a1 != a2) { 335 ary_replace(mrb, a1, a2 ->ptr, a2->len);409 ary_replace(mrb, a1, a2); 336 410 } 337 411 } … … 354 428 struct RArray *a2; 355 429 mrb_value *ptr; 356 mrb_int times ;430 mrb_int times, len1; 357 431 358 432 mrb_get_args(mrb, "i", ×); … … 361 435 } 362 436 if (times == 0) return mrb_ary_new(mrb); 363 if (ARY_MAX_SIZE / times < a1->len) {437 if (ARY_MAX_SIZE / times < ARY_LEN(a1)) { 364 438 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 365 439 } 366 a2 = ary_new_capa(mrb, a1->len * times); 367 ptr = a2->ptr; 440 len1 = ARY_LEN(a1); 441 a2 = ary_new_capa(mrb, len1 * times); 442 ARY_SET_LEN(a2, len1 * times); 443 ptr = ARY_PTR(a2); 368 444 while (times--) { 369 array_copy(ptr, a1->ptr, a1->len); 370 ptr += a1->len; 371 a2->len += a1->len; 445 array_copy(ptr, ARY_PTR(a1), len1); 446 ptr += len1; 372 447 } 373 448 … … 379 454 { 380 455 struct RArray *a = mrb_ary_ptr(self); 381 382 if (a->len > 1) { 456 mrb_int len = ARY_LEN(a); 457 458 if (len > 1) { 383 459 mrb_value *p1, *p2; 384 460 385 461 ary_modify(mrb, a); 386 p1 = a->ptr;387 p2 = a->ptr + a->len - 1;462 p1 = ARY_PTR(a); 463 p2 = p1 + len - 1; 388 464 389 465 while (p1 < p2) { … … 399 475 mrb_ary_reverse(mrb_state *mrb, mrb_value self) 400 476 { 401 struct RArray *a = mrb_ary_ptr(self), *b = ary_new_capa(mrb, a->len); 402 403 if (a->len > 0) { 477 struct RArray *a = mrb_ary_ptr(self), *b = ary_new_capa(mrb, ARY_LEN(a)); 478 mrb_int len = ARY_LEN(a); 479 480 if (len > 0) { 404 481 mrb_value *p1, *p2, *e; 405 482 406 p1 = a->ptr;407 e = p1 + a->len;408 p2 = b->ptr + a->len - 1;483 p1 = ARY_PTR(a); 484 e = p1 + len; 485 p2 = ARY_PTR(b) + len - 1; 409 486 while (p1 < e) { 410 487 *p2-- = *p1++; 411 488 } 412 b->len = a->len;489 ARY_SET_LEN(b, len); 413 490 } 414 491 return mrb_obj_value(b); … … 419 496 { 420 497 struct RArray *a = mrb_ary_ptr(ary); 498 mrb_int len = ARY_LEN(a); 421 499 422 500 ary_modify(mrb, a); 423 if (a->len == a->aux.capa) 424 ary_expand_capa(mrb, a, a->len + 1); 425 a->ptr[a->len++] = elem; 501 if (len == ARY_CAPA(a)) 502 ary_expand_capa(mrb, a, len + 1); 503 ARY_PTR(a)[len] = elem; 504 ARY_SET_LEN(a, len+1); 426 505 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, elem); 427 506 } … … 431 510 { 432 511 mrb_value *argv; 433 mrb_int len; 434 435 mrb_get_args(mrb, "*", &argv, &len); 436 while (len--) { 437 mrb_ary_push(mrb, self, *argv++); 438 } 512 mrb_int len, len2, alen; 513 struct RArray *a; 514 515 mrb_get_args(mrb, "*!", &argv, &alen); 516 a = mrb_ary_ptr(self); 517 ary_modify(mrb, a); 518 len = ARY_LEN(a); 519 len2 = len + alen; 520 if (ARY_CAPA(a) < len2) { 521 ary_expand_capa(mrb, a, len2); 522 } 523 array_copy(ARY_PTR(a)+len, argv, alen); 524 ARY_SET_LEN(a, len2); 525 mrb_write_barrier(mrb, (struct RBasic*)a); 439 526 440 527 return self; … … 445 532 { 446 533 struct RArray *a = mrb_ary_ptr(ary); 447 448 ary_modify(mrb, a); 449 if (a->len == 0) return mrb_nil_value(); 450 return a->ptr[--a->len]; 534 mrb_int len = ARY_LEN(a); 535 536 ary_modify_check(mrb, a); 537 if (len == 0) return mrb_nil_value(); 538 ARY_SET_LEN(a, len-1); 539 return ARY_PTR(a)[len-1]; 451 540 } 452 541 … … 457 546 { 458 547 struct RArray *a = mrb_ary_ptr(self); 548 mrb_int len = ARY_LEN(a); 459 549 mrb_value val; 460 550 461 ary_modify (mrb, a);462 if ( a->len == 0) return mrb_nil_value();551 ary_modify_check(mrb, a); 552 if (len == 0) return mrb_nil_value(); 463 553 if (ARY_SHARED_P(a)) { 464 554 L_SHIFT: 465 val = a-> ptr[0];466 a-> ptr++;467 a-> len--;555 val = a->as.heap.ptr[0]; 556 a->as.heap.ptr++; 557 a->as.heap.len--; 468 558 return val; 469 559 } 470 if ( a->len > ARY_SHIFT_SHARED_MIN) {560 if (len > ARY_SHIFT_SHARED_MIN) { 471 561 ary_make_shared(mrb, a); 472 562 goto L_SHIFT; 473 563 } 474 564 else { 475 mrb_value *ptr = a->ptr;476 mrb_int size = a->len;565 mrb_value *ptr = ARY_PTR(a); 566 mrb_int size = len; 477 567 478 568 val = *ptr; … … 481 571 ++ptr; 482 572 } 483 --a->len;573 ARY_SET_LEN(a, len-1); 484 574 } 485 575 return val; … … 494 584 { 495 585 struct RArray *a = mrb_ary_ptr(self); 586 mrb_int len = ARY_LEN(a); 496 587 497 588 if (ARY_SHARED_P(a) 498 && a->a ux.shared->refcnt == 1 /* shared only referenced from this array */499 && a-> ptr - a->aux.shared->ptr >= 1) /* there's room for unshifted item */ {500 a-> ptr--;501 a-> ptr[0] = item;589 && a->as.heap.aux.shared->refcnt == 1 /* shared only referenced from this array */ 590 && a->as.heap.ptr - a->as.heap.aux.shared->ptr >= 1) /* there's room for unshifted item */ { 591 a->as.heap.ptr--; 592 a->as.heap.ptr[0] = item; 502 593 } 503 594 else { 595 mrb_value *ptr; 596 504 597 ary_modify(mrb, a); 505 if (a->aux.capa < a->len + 1) 506 ary_expand_capa(mrb, a, a->len + 1); 507 value_move(a->ptr + 1, a->ptr, a->len); 508 a->ptr[0] = item; 509 } 510 a->len++; 598 if (ARY_CAPA(a) < len + 1) 599 ary_expand_capa(mrb, a, len + 1); 600 ptr = ARY_PTR(a); 601 value_move(ptr + 1, ptr, len); 602 ptr[0] = item; 603 } 604 ARY_SET_LEN(a, len+1); 511 605 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, item); 512 606 … … 518 612 { 519 613 struct RArray *a = mrb_ary_ptr(self); 520 mrb_value *vals; 521 mrb_int len; 522 523 mrb_get_args(mrb, "*", &vals, &len); 524 if (len > ARY_MAX_SIZE - a->len) { 614 mrb_value *vals, *ptr; 615 mrb_int alen, len; 616 617 mrb_get_args(mrb, "*!", &vals, &alen); 618 if (alen == 0) { 619 ary_modify_check(mrb, a); 620 return self; 621 } 622 len = ARY_LEN(a); 623 if (alen > ARY_MAX_SIZE - len) { 525 624 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 526 625 } 527 626 if (ARY_SHARED_P(a) 528 && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ 529 && a->ptr - a->aux.shared->ptr >= len) /* there's room for unshifted item */ { 530 a->ptr -= len; 627 && a->as.heap.aux.shared->refcnt == 1 /* shared only referenced from this array */ 628 && a->as.heap.ptr - a->as.heap.aux.shared->ptr >= alen) /* there's room for unshifted item */ { 629 ary_modify_check(mrb, a); 630 a->as.heap.ptr -= alen; 631 ptr = a->as.heap.ptr; 531 632 } 532 633 else { 634 mrb_bool same = vals == ARY_PTR(a); 533 635 ary_modify(mrb, a); 534 if (len == 0) return self; 535 if (a->aux.capa < a->len + len) 536 ary_expand_capa(mrb, a, a->len + len); 537 value_move(a->ptr + len, a->ptr, a->len); 538 } 539 array_copy(a->ptr, vals, len); 540 a->len += len; 541 while (len--) { 542 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, vals[len]); 636 if (ARY_CAPA(a) < len + alen) 637 ary_expand_capa(mrb, a, len + alen); 638 ptr = ARY_PTR(a); 639 value_move(ptr + alen, ptr, len); 640 if (same) vals = ptr; 641 } 642 array_copy(ptr, vals, alen); 643 ARY_SET_LEN(a, len+alen); 644 while (alen--) { 645 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, vals[alen]); 543 646 } 544 647 … … 550 653 { 551 654 struct RArray *a = mrb_ary_ptr(ary); 655 mrb_int len = ARY_LEN(a); 552 656 553 657 /* range check */ 554 if (n < 0) n += a->len;555 if (n < 0 || a->len <= n) return mrb_nil_value();556 557 return a->ptr[n];658 if (n < 0) n += len; 659 if (n < 0 || len <= n) return mrb_nil_value(); 660 661 return ARY_PTR(a)[n]; 558 662 } 559 663 … … 562 666 { 563 667 struct RArray *a = mrb_ary_ptr(ary); 668 mrb_int len = ARY_LEN(a); 564 669 565 670 ary_modify(mrb, a); 566 671 /* range check */ 567 672 if (n < 0) { 568 n += a->len;673 n += len; 569 674 if (n < 0) { 570 mrb_raisef(mrb, E_INDEX_ERROR, "index % S out of array", mrb_fixnum_value(n - a->len));571 } 572 } 573 if ( a->len <= n) {574 if ( a->aux.capa<= n)675 mrb_raisef(mrb, E_INDEX_ERROR, "index %i out of array", n - len); 676 } 677 } 678 if (len <= n) { 679 if (ARY_CAPA(a) <= n) 575 680 ary_expand_capa(mrb, a, n + 1); 576 ary_fill_with_nil( a->ptr + a->len, n + 1 - a->len);577 a->len = n + 1;578 } 579 580 a->ptr[n] = val;681 ary_fill_with_nil(ARY_PTR(a) + len, n + 1 - len); 682 ARY_SET_LEN(a, n+1); 683 } 684 685 ARY_PTR(a)[n] = val; 581 686 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, val); 582 687 } … … 585 690 ary_dup(mrb_state *mrb, struct RArray *a) 586 691 { 587 struct RArray *d = ary_new_capa(mrb, a->len); 588 589 ary_replace(mrb, d, a->ptr, a->len); 590 return d; 692 return ary_new_from_values(mrb, ARY_LEN(a), ARY_PTR(a)); 591 693 } 592 694 … … 595 697 { 596 698 struct RArray *a = mrb_ary_ptr(ary); 699 mrb_int alen = ARY_LEN(a); 597 700 const mrb_value *argv; 598 701 mrb_int argc; … … 602 705 603 706 /* len check */ 604 if (len < 0) mrb_raisef(mrb, E_INDEX_ERROR, "negative length (% S)", mrb_fixnum_value(len));707 if (len < 0) mrb_raisef(mrb, E_INDEX_ERROR, "negative length (%i)", len); 605 708 606 709 /* range check */ 607 710 if (head < 0) { 608 head += a ->len;711 head += alen; 609 712 if (head < 0) { 610 713 mrb_raise(mrb, E_INDEX_ERROR, "index is out of array"); … … 612 715 } 613 716 tail = head + len; 614 if (a ->len < len || a->len < tail) {615 len = a ->len - head;717 if (alen < len || alen < tail) { 718 len = alen - head; 616 719 } 617 720 … … 620 723 argc = RARRAY_LEN(rpl); 621 724 argv = RARRAY_PTR(rpl); 622 if (argv == a->ptr) {725 if (argv == ARY_PTR(a)) { 623 726 struct RArray *r; 624 727 … … 627 730 } 628 731 r = ary_dup(mrb, a); 629 argv = r->ptr;732 argv = ARY_PTR(r); 630 733 } 631 734 } … … 634 737 argv = &rpl; 635 738 } 636 if (head >= a ->len) {739 if (head >= alen) { 637 740 if (head > ARY_MAX_SIZE - argc) { 638 mrb_raisef(mrb, E_INDEX_ERROR, "index % S too big", mrb_fixnum_value(head));741 mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", head); 639 742 } 640 743 len = head + argc; 641 if (len > a->aux.capa) {744 if (len > ARY_CAPA(a)) { 642 745 ary_expand_capa(mrb, a, head + argc); 643 746 } 644 ary_fill_with_nil( a->ptr + a->len, head - a->len);747 ary_fill_with_nil(ARY_PTR(a) + alen, head - alen); 645 748 if (argc > 0) { 646 array_copy( a->ptr+ head, argv, argc);647 } 648 a->len = len;749 array_copy(ARY_PTR(a) + head, argv, argc); 750 } 751 ARY_SET_LEN(a, len); 649 752 } 650 753 else { 651 mrb_int alen;652 653 if (a ->len - len > ARY_MAX_SIZE - argc) {654 mrb_raisef(mrb, E_INDEX_ERROR, "index % S too big", mrb_fixnum_value(a->len + argc - len));655 } 656 alen = a->len + argc - len;657 if ( alen > a->aux.capa) {658 ary_expand_capa(mrb, a, alen);754 mrb_int newlen; 755 756 if (alen - len > ARY_MAX_SIZE - argc) { 757 mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", alen + argc - len); 758 } 759 newlen = alen + argc - len; 760 if (newlen > ARY_CAPA(a)) { 761 ary_expand_capa(mrb, a, newlen); 659 762 } 660 763 661 764 if (len != argc) { 765 mrb_value *ptr = ARY_PTR(a); 662 766 tail = head + len; 663 value_move( a->ptr + head + argc, a->ptr + tail, a->len - tail);664 a->len = alen;767 value_move(ptr + head + argc, ptr + tail, alen - tail); 768 ARY_SET_LEN(a, newlen); 665 769 } 666 770 if (argc > 0) { 667 value_move( a->ptr+ head, argv, argc);771 value_move(ARY_PTR(a) + head, argv, argc); 668 772 } 669 773 } … … 687 791 struct RArray *b; 688 792 793 if (!ARY_SHARED_P(a) && len <= ARY_SHIFT_SHARED_MIN) { 794 return mrb_ary_new_from_values(mrb, len, ARY_PTR(a)+beg); 795 } 689 796 ary_make_shared(mrb, a); 690 797 b = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); 691 b-> ptr = a->ptr + beg;692 b-> len = len;693 b->a ux.shared = a->aux.shared;694 b->a ux.shared->refcnt++;798 b->as.heap.ptr = a->as.heap.ptr + beg; 799 b->as.heap.len = len; 800 b->as.heap.aux.shared = a->as.heap.aux.shared; 801 b->as.heap.aux.shared->refcnt++; 695 802 ARY_SET_SHARED_FLAG(b); 696 803 … … 704 811 return mrb_fixnum(index); 705 812 } 813 #ifndef MRB_WITHOUT_FLOAT 706 814 else if (mrb_float_p(index)) { 707 815 return (mrb_int)mrb_float(index); 708 816 } 817 #endif 709 818 else { 710 819 mrb_int i, argc; 711 820 mrb_value *argv; 712 821 713 mrb_get_args(mrb, "i* ", &i, &argv, &argc);822 mrb_get_args(mrb, "i*!", &i, &argv, &argc); 714 823 return i; 715 824 } … … 747 856 { 748 857 struct RArray *a = mrb_ary_ptr(self); 749 mrb_int i, len ;858 mrb_int i, len, alen; 750 859 mrb_value index; 751 860 … … 754 863 /* a[n..m] */ 755 864 case MRB_TT_RANGE: 756 if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) {865 if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == MRB_RANGE_OK) { 757 866 return ary_subseq(mrb, a, i, len); 758 867 } … … 768 877 769 878 i = aget_index(mrb, index); 770 if (i < 0) i += a->len; 771 if (i < 0 || a->len < i) return mrb_nil_value(); 879 alen = ARY_LEN(a); 880 if (i < 0) i += alen; 881 if (i < 0 || alen < i) return mrb_nil_value(); 772 882 if (len < 0) return mrb_nil_value(); 773 if (a ->len == i) return mrb_ary_new(mrb);774 if (len > a ->len - i) len = a->len - i;883 if (alen == i) return mrb_ary_new(mrb); 884 if (len > alen - i) len = alen - i; 775 885 776 886 return ary_subseq(mrb, a, i, len); … … 822 932 /* a[n..m] = v */ 823 933 switch (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self), FALSE)) { 824 case 0: /* not range */934 case MRB_RANGE_TYPE_MISMATCH: 825 935 mrb_ary_set(mrb, self, aget_index(mrb, v1), v2); 826 936 break; 827 case 1: /* range */937 case MRB_RANGE_OK: 828 938 mrb_ary_splice(mrb, self, i, len, v2); 829 939 break; 830 case 2: /* out of range */831 mrb_raisef(mrb, E_RANGE_ERROR, "% Sout of range", v1);940 case MRB_RANGE_OUT: 941 mrb_raisef(mrb, E_RANGE_ERROR, "%v out of range", v1); 832 942 break; 833 943 } … … 847 957 mrb_value val; 848 958 mrb_value *ptr; 849 mrb_int len ;959 mrb_int len, alen; 850 960 851 961 mrb_get_args(mrb, "i", &index); 852 if (index < 0) index += a->len; 853 if (index < 0 || a->len <= index) return mrb_nil_value(); 962 alen = ARY_LEN(a); 963 if (index < 0) index += alen; 964 if (index < 0 || alen <= index) return mrb_nil_value(); 854 965 855 966 ary_modify(mrb, a); 856 val = a->ptr[index]; 857 858 ptr = a->ptr + index; 859 len = a->len - index; 967 ptr = ARY_PTR(a); 968 val = ptr[index]; 969 970 ptr += index; 971 len = alen - index; 860 972 while (--len) { 861 973 *ptr = *(ptr+1); 862 974 ++ptr; 863 975 } 864 --a->len;976 ARY_SET_LEN(a, alen-1); 865 977 866 978 ary_shrink_capa(mrb, a); … … 873 985 { 874 986 struct RArray *a = mrb_ary_ptr(self); 875 mrb_int size; 876 877 if (mrb_get_args(mrb, "|i", &size) == 0) { 878 return (a->len > 0)? a->ptr[0]: mrb_nil_value(); 879 } 987 mrb_int size, alen; 988 989 if (mrb_get_argc(mrb) == 0) { 990 return (ARY_LEN(a) > 0)? ARY_PTR(a)[0]: mrb_nil_value(); 991 } 992 mrb_get_args(mrb, "|i", &size); 880 993 if (size < 0) { 881 994 mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); 882 995 } 883 996 884 if (size > a->len) size = a->len; 997 alen = ARY_LEN(a); 998 if (size > alen) size = alen; 885 999 if (ARY_SHARED_P(a)) { 886 1000 return ary_subseq(mrb, a, 0, size); 887 1001 } 888 return mrb_ary_new_from_values(mrb, size, a->ptr);1002 return mrb_ary_new_from_values(mrb, size, ARY_PTR(a)); 889 1003 } 890 1004 … … 893 1007 { 894 1008 struct RArray *a = mrb_ary_ptr(self); 895 mrb_int size; 896 897 if (mrb_get_args(mrb, "|i", &size) == 0) 898 return (a->len > 0)? a->ptr[a->len - 1]: mrb_nil_value(); 1009 mrb_int n, size, alen; 1010 1011 n = mrb_get_args(mrb, "|i", &size); 1012 alen = ARY_LEN(a); 1013 if (n == 0) { 1014 return (alen > 0) ? ARY_PTR(a)[alen - 1]: mrb_nil_value(); 1015 } 899 1016 900 1017 if (size < 0) { 901 1018 mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); 902 1019 } 903 if (size > a ->len) size = a->len;1020 if (size > alen) size = alen; 904 1021 if (ARY_SHARED_P(a) || size > ARY_DEFAULT_LEN) { 905 return ary_subseq(mrb, a, a ->len - size, size);906 } 907 return mrb_ary_new_from_values(mrb, size, a->ptr + a->len - size);1022 return ary_subseq(mrb, a, alen - size, size); 1023 } 1024 return mrb_ary_new_from_values(mrb, size, ARY_PTR(a) + alen - size); 908 1025 } 909 1026 … … 944 1061 mrb_ary_splat(mrb_state *mrb, mrb_value v) 945 1062 { 946 mrb_value a , recv_class;1063 mrb_value a; 947 1064 948 1065 if (mrb_array_p(v)) { … … 955 1072 956 1073 a = mrb_funcall(mrb, v, "to_a", 0); 957 if (mrb_array_p(a)) { 958 return a; 959 } 960 else if (mrb_nil_p(a)) { 1074 if (mrb_nil_p(a)) { 961 1075 return mrb_ary_new_from_values(mrb, 1, &v); 962 1076 } 963 else { 964 recv_class = mrb_obj_value(mrb_obj_class(mrb, v)); 965 mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Array (%S#to_a gives %S)", 966 recv_class, 967 recv_class, 968 mrb_obj_value(mrb_obj_class(mrb, a)) 969 ); 970 /* not reached */ 971 return mrb_undef_value(); 972 } 1077 mrb_ensure_array_type(mrb, a); 1078 return a; 973 1079 } 974 1080 … … 978 1084 struct RArray *a = mrb_ary_ptr(self); 979 1085 980 return mrb_fixnum_value( a->len);1086 return mrb_fixnum_value(ARY_LEN(a)); 981 1087 } 982 1088 … … 988 1094 ary_modify(mrb, a); 989 1095 if (ARY_SHARED_P(a)) { 990 mrb_ary_decref(mrb, a->a ux.shared);1096 mrb_ary_decref(mrb, a->as.heap.aux.shared); 991 1097 ARY_UNSET_SHARED_FLAG(a); 992 1098 } 993 else { 994 mrb_free(mrb, a->ptr); 995 } 996 a->len = 0; 997 a->aux.capa = 0; 998 a->ptr = 0; 1099 else if (!ARY_EMBED_P(a)){ 1100 mrb_free(mrb, a->as.heap.ptr); 1101 } 1102 ARY_SET_EMBED_LEN(a, 0); 999 1103 1000 1104 return self; … … 1002 1106 1003 1107 static mrb_value 1108 mrb_ary_clear_m(mrb_state *mrb, mrb_value self) 1109 { 1110 return mrb_ary_clear(mrb, self); 1111 } 1112 1113 static mrb_value 1004 1114 mrb_ary_empty_p(mrb_state *mrb, mrb_value self) 1005 1115 { 1006 1116 struct RArray *a = mrb_ary_ptr(self); 1007 1117 1008 return mrb_bool_value(a->len == 0); 1009 } 1010 1011 MRB_API mrb_value 1012 mrb_check_array_type(mrb_state *mrb, mrb_value ary) 1013 { 1014 return mrb_check_convert_type(mrb, ary, MRB_TT_ARRAY, "Array", "to_ary"); 1118 return mrb_bool_value(ARY_LEN(a) == 0); 1015 1119 } 1016 1120 … … 1021 1125 offset += RARRAY_LEN(ary); 1022 1126 } 1023 return ary_elt(ary, offset); 1127 if (offset < 0 || RARRAY_LEN(ary) <= offset) { 1128 return mrb_nil_value(); 1129 } 1130 return RARRAY_PTR(ary)[offset]; 1024 1131 } 1025 1132 … … 1039 1146 mrb_ary_push(mrb, list, ary); 1040 1147 1041 result = mrb_str_ buf_new(mrb, 64);1148 result = mrb_str_new_capa(mrb, 64); 1042 1149 1043 1150 for (i=0; i<RARRAY_LEN(ary); i++) { … … 1065 1172 goto str_join; 1066 1173 } 1067 tmp = mrb_check_ convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");1174 tmp = mrb_check_array_type(mrb, val); 1068 1175 if (!mrb_nil_p(tmp)) { 1069 1176 val = tmp; … … 1139 1246 } 1140 1247 1248 /* internal method to convert multi-value to single value */ 1249 static mrb_value 1250 mrb_ary_svalue(mrb_state *mrb, mrb_value ary) 1251 { 1252 switch (RARRAY_LEN(ary)) { 1253 case 0: 1254 return mrb_nil_value(); 1255 case 1: 1256 return RARRAY_PTR(ary)[0]; 1257 default: 1258 return ary; 1259 } 1260 } 1261 1262 static const mrb_code each_iseq[] = { 1263 OP_ENTER, 0x0, 0x00, 0x1, /* OP_ENTER 0:0:0:0:0:0:1 */ 1264 OP_JMPIF, 0x1, 0x0, 19, /* OP_JMPIF R1 19 */ 1265 OP_LOADSELF, 0x3, /* OP_LOADSELF R3 */ 1266 OP_LOADSYM, 0x4, 0x0, /* OP_LOADSYM R4 :each*/ 1267 OP_SEND, 0x3, 0x1, 0x1, /* OP_SEND R3 :to_enum 1 */ 1268 OP_RETURN, 0x3, /* OP_RETURN R3 */ 1269 OP_LOADI_0, 0x2, /* OP_LOADI_0 R2 */ 1270 OP_JMP, 0x0, 43, /* OP_JMP 49 */ 1271 OP_MOVE, 0x3, 0x1, /* OP_MOVE R3 R1 */ 1272 OP_LOADSELF, 0x4, /* OP_LOADSELF R4 */ 1273 OP_MOVE, 0x5, 0x2, /* OP_MOVE R5 R2 */ 1274 OP_SEND, 0x4, 0x2, 0x1, /* OP_SEND R4 :[] 1 */ 1275 OP_SEND, 0x3, 0x3, 0x1, /* OP_SEND R3 :call 1 */ 1276 OP_ADDI, 0x2, 1, /* OP_ADDI R3 1 */ 1277 OP_MOVE, 0x3, 0x2, /* OP_MOVE R3 R2 */ 1278 OP_LOADSELF, 0x4, /* OP_LOADSELF R4 */ 1279 OP_SEND, 0x4, 0x4, 0x0, /* OP_SEND R4 :length 0 */ 1280 OP_LT, 0x3, /* OP_LT R3 */ 1281 OP_JMPIF, 0x3, 0x0, 24, /* OP_JMPIF R3 24 */ 1282 OP_RETURN, 0x0 /* OP_RETURN R3 */ 1283 }; 1284 1285 static void 1286 init_ary_each(mrb_state *mrb, struct RClass *ary) 1287 { 1288 struct RProc *p; 1289 mrb_method_t m; 1290 mrb_irep *each_irep = (mrb_irep*)mrb_malloc(mrb, sizeof(mrb_irep)); 1291 static const mrb_irep mrb_irep_zero = { 0 }; 1292 1293 *each_irep = mrb_irep_zero; 1294 each_irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*5); 1295 each_irep->syms[0] = mrb_intern_lit(mrb, "each"); 1296 each_irep->syms[1] = mrb_intern_lit(mrb, "to_enum"); 1297 each_irep->syms[2] = mrb_intern_lit(mrb, "[]"); 1298 each_irep->syms[3] = mrb_intern_lit(mrb, "call"); 1299 each_irep->syms[4] = mrb_intern_lit(mrb, "length"); 1300 each_irep->slen = 5; 1301 each_irep->flags = MRB_ISEQ_NO_FREE; 1302 each_irep->iseq = each_iseq; 1303 each_irep->ilen = sizeof(each_iseq); 1304 each_irep->nregs = 7; 1305 each_irep->nlocals = 3; 1306 p = mrb_proc_new(mrb, each_irep); 1307 p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT; 1308 MRB_METHOD_FROM_PROC(m, p); 1309 mrb_define_method_raw(mrb, ary, mrb_intern_lit(mrb, "each"), m); 1310 } 1311 1141 1312 void 1142 1313 mrb_init_array(mrb_state *mrb) … … 1144 1315 struct RClass *a; 1145 1316 1146 mrb->array_class = a = mrb_define_class(mrb, "Array", mrb->object_class); /* 15.2.12 */1317 mrb->array_class = a = mrb_define_class(mrb, "Array", mrb->object_class); /* 15.2.12 */ 1147 1318 MRB_SET_INSTANCE_TT(a, MRB_TT_ARRAY); 1148 1319 1149 mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */ 1150 1151 mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */ 1152 mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */ 1153 mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */ 1154 mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.4 */ 1155 mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ANY()); /* 15.2.12.5.5 */ 1156 mrb_define_method(mrb, a, "clear", mrb_ary_clear, MRB_ARGS_NONE()); /* 15.2.12.5.6 */ 1157 mrb_define_method(mrb, a, "concat", mrb_ary_concat_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.8 */ 1158 mrb_define_method(mrb, a, "delete_at", mrb_ary_delete_at, MRB_ARGS_REQ(1)); /* 15.2.12.5.9 */ 1159 mrb_define_method(mrb, a, "empty?", mrb_ary_empty_p, MRB_ARGS_NONE()); /* 15.2.12.5.12 */ 1160 mrb_define_method(mrb, a, "first", mrb_ary_first, MRB_ARGS_OPT(1)); /* 15.2.12.5.13 */ 1161 mrb_define_method(mrb, a, "index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.14 */ 1162 mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.16 */ 1163 mrb_define_method(mrb, a, "join", mrb_ary_join_m, MRB_ARGS_ANY()); /* 15.2.12.5.17 */ 1164 mrb_define_method(mrb, a, "last", mrb_ary_last, MRB_ARGS_ANY()); /* 15.2.12.5.18 */ 1165 mrb_define_method(mrb, a, "length", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.19 */ 1166 mrb_define_method(mrb, a, "pop", mrb_ary_pop, MRB_ARGS_NONE()); /* 15.2.12.5.21 */ 1167 mrb_define_method(mrb, a, "push", mrb_ary_push_m, MRB_ARGS_ANY()); /* 15.2.12.5.22 */ 1168 mrb_define_method(mrb, a, "append", mrb_ary_push_m, MRB_ARGS_ANY()); 1169 mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */ 1170 mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, MRB_ARGS_NONE()); /* 15.2.12.5.24 */ 1171 mrb_define_method(mrb, a, "reverse!", mrb_ary_reverse_bang, MRB_ARGS_NONE()); /* 15.2.12.5.25 */ 1172 mrb_define_method(mrb, a, "rindex", mrb_ary_rindex_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.26 */ 1173 mrb_define_method(mrb, a, "shift", mrb_ary_shift, MRB_ARGS_NONE()); /* 15.2.12.5.27 */ 1174 mrb_define_method(mrb, a, "size", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.28 */ 1175 mrb_define_method(mrb, a, "slice", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.29 */ 1176 mrb_define_method(mrb, a, "unshift", mrb_ary_unshift_m, MRB_ARGS_ANY()); /* 15.2.12.5.30 */ 1177 mrb_define_method(mrb, a, "prepend", mrb_ary_unshift_m, MRB_ARGS_ANY()); 1320 mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */ 1321 1322 mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */ 1323 mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */ 1324 mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */ 1325 mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ARG(1,1)); /* 15.2.12.5.4 */ 1326 mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ARG(2,1)); /* 15.2.12.5.5 */ 1327 mrb_define_method(mrb, a, "clear", mrb_ary_clear_m, MRB_ARGS_NONE()); /* 15.2.12.5.6 */ 1328 mrb_define_method(mrb, a, "concat", mrb_ary_concat_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.8 */ 1329 mrb_define_method(mrb, a, "delete_at", mrb_ary_delete_at, MRB_ARGS_REQ(1)); /* 15.2.12.5.9 */ 1330 mrb_define_method(mrb, a, "empty?", mrb_ary_empty_p, MRB_ARGS_NONE()); /* 15.2.12.5.12 */ 1331 mrb_define_method(mrb, a, "first", mrb_ary_first, MRB_ARGS_OPT(1)); /* 15.2.12.5.13 */ 1332 mrb_define_method(mrb, a, "index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.14 */ 1333 mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.16 */ 1334 mrb_define_method(mrb, a, "join", mrb_ary_join_m, MRB_ARGS_OPT(1)); /* 15.2.12.5.17 */ 1335 mrb_define_method(mrb, a, "last", mrb_ary_last, MRB_ARGS_OPT(1)); /* 15.2.12.5.18 */ 1336 mrb_define_method(mrb, a, "length", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.19 */ 1337 mrb_define_method(mrb, a, "pop", mrb_ary_pop, MRB_ARGS_NONE()); /* 15.2.12.5.21 */ 1338 mrb_define_method(mrb, a, "push", mrb_ary_push_m, MRB_ARGS_ANY()); /* 15.2.12.5.22 */ 1339 mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */ 1340 mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, MRB_ARGS_NONE()); /* 15.2.12.5.24 */ 1341 mrb_define_method(mrb, a, "reverse!", mrb_ary_reverse_bang, MRB_ARGS_NONE()); /* 15.2.12.5.25 */ 1342 mrb_define_method(mrb, a, "rindex", mrb_ary_rindex_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.26 */ 1343 mrb_define_method(mrb, a, "shift", mrb_ary_shift, MRB_ARGS_NONE()); /* 15.2.12.5.27 */ 1344 mrb_define_method(mrb, a, "size", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.28 */ 1345 mrb_define_method(mrb, a, "slice", mrb_ary_aget, MRB_ARGS_ARG(1,1)); /* 15.2.12.5.29 */ 1346 mrb_define_method(mrb, a, "unshift", mrb_ary_unshift_m, MRB_ARGS_ANY()); /* 15.2.12.5.30 */ 1178 1347 1179 1348 mrb_define_method(mrb, a, "__ary_eq", mrb_ary_eq, MRB_ARGS_REQ(1)); 1180 1349 mrb_define_method(mrb, a, "__ary_cmp", mrb_ary_cmp, MRB_ARGS_REQ(1)); 1181 mrb_define_method(mrb, a, "__ary_index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* kept for mruby-array-ext */ 1182 } 1350 mrb_define_method(mrb, a, "__ary_index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* kept for mruby-array-ext */ 1351 mrb_define_method(mrb, a, "__svalue", mrb_ary_svalue, MRB_ARGS_NONE()); 1352 1353 init_ary_each(mrb, a); 1354 }
Note:
See TracChangeset
for help on using the changeset viewer.