Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/builtins.cc

Issue 206183006: ArrayPush builtin handlified. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/elements.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 args.receiver(), 399 args.receiver(),
400 argc, 400 argc,
401 argv.start(), 401 argv.start(),
402 &pending_exception); 402 &pending_exception);
403 if (pending_exception) return Failure::Exception(); 403 if (pending_exception) return Failure::Exception();
404 return *result; 404 return *result;
405 } 405 }
406 406
407 407
408 BUILTIN(ArrayPush) { 408 BUILTIN(ArrayPush) {
409 Heap* heap = isolate->heap(); 409 HandleScope scope(isolate);
410 Object* receiver = *args.receiver(); 410 Handle<Object> receiver = args.receiver();
411 FixedArrayBase* elms_obj; 411 Handle<Object> elms_or_null =
412 MaybeObject* maybe_elms_obj = 412 EnsureJSArrayWithWritableFastElementsWrapper(isolate, receiver, &args, 1);
413 EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 1); 413 RETURN_IF_EMPTY_HANDLE(isolate, elms_or_null);
414 if (maybe_elms_obj == NULL) { 414 if (*elms_or_null == NULL) return CallJsBuiltin(isolate, "ArrayPush", args);
415 return CallJsBuiltin(isolate, "ArrayPush", args);
416 }
417 if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj;
418 415
419 JSArray* array = JSArray::cast(receiver); 416 Handle<FixedArrayBase> elms_obj = Handle<FixedArrayBase>::cast(elms_or_null);
417 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
420 ASSERT(!array->map()->is_observed()); 418 ASSERT(!array->map()->is_observed());
421 419
422 ElementsKind kind = array->GetElementsKind(); 420 ElementsKind kind = array->GetElementsKind();
423 421
424 if (IsFastSmiOrObjectElementsKind(kind)) { 422 if (IsFastSmiOrObjectElementsKind(kind)) {
425 FixedArray* elms = FixedArray::cast(elms_obj); 423 Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj);
426 424
427 int len = Smi::cast(array->length())->value(); 425 int len = Smi::cast(array->length())->value();
428 int to_add = args.length() - 1; 426 int to_add = args.length() - 1;
429 if (to_add == 0) { 427 if (to_add == 0) {
430 return Smi::FromInt(len); 428 return Smi::FromInt(len);
431 } 429 }
432 // Currently fixed arrays cannot grow too big, so 430 // Currently fixed arrays cannot grow too big, so
433 // we should never hit this case. 431 // we should never hit this case.
434 ASSERT(to_add <= (Smi::kMaxValue - len)); 432 ASSERT(to_add <= (Smi::kMaxValue - len));
435 433
436 int new_length = len + to_add; 434 int new_length = len + to_add;
437 435
438 if (new_length > elms->length()) { 436 if (new_length > elms->length()) {
439 // New backing storage is needed. 437 // New backing storage is needed.
440 int capacity = new_length + (new_length >> 1) + 16; 438 int capacity = new_length + (new_length >> 1) + 16;
441 FixedArray* new_elms; 439 Handle<FixedArray> new_elms =
442 MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity); 440 isolate->factory()->NewUninitializedFixedArray(capacity);
443 if (!maybe_obj->To(&new_elms)) return maybe_obj;
444 441
445 ElementsAccessor* accessor = array->GetElementsAccessor(); 442 ElementsAccessor* accessor = array->GetElementsAccessor();
446 MaybeObject* maybe_failure = accessor->CopyElements( 443 accessor->CopyElements(
447 NULL, 0, kind, new_elms, 0, 444 Handle<JSObject>::null(), 0, kind, new_elms, 0,
448 ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj); 445 ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
449 ASSERT(!maybe_failure->IsFailure());
450 USE(maybe_failure);
451 446
452 elms = new_elms; 447 elms = new_elms;
453 } 448 }
454 449
455 // Add the provided values. 450 // Add the provided values.
456 DisallowHeapAllocation no_gc; 451 DisallowHeapAllocation no_gc;
457 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); 452 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
458 for (int index = 0; index < to_add; index++) { 453 for (int index = 0; index < to_add; index++) {
459 elms->set(index + len, args[index + 1], mode); 454 elms->set(index + len, args[index + 1], mode);
460 } 455 }
461 456
462 if (elms != array->elements()) { 457 if (*elms != array->elements()) {
463 array->set_elements(elms); 458 array->set_elements(*elms);
464 } 459 }
465 460
466 // Set the length. 461 // Set the length.
467 array->set_length(Smi::FromInt(new_length)); 462 array->set_length(Smi::FromInt(new_length));
468 return Smi::FromInt(new_length); 463 return Smi::FromInt(new_length);
469 } else { 464 } else {
470 int len = Smi::cast(array->length())->value(); 465 int len = Smi::cast(array->length())->value();
471 int elms_len = elms_obj->length(); 466 int elms_len = elms_obj->length();
472 467
473 int to_add = args.length() - 1; 468 int to_add = args.length() - 1;
474 if (to_add == 0) { 469 if (to_add == 0) {
475 return Smi::FromInt(len); 470 return Smi::FromInt(len);
476 } 471 }
477 // Currently fixed arrays cannot grow too big, so 472 // Currently fixed arrays cannot grow too big, so
478 // we should never hit this case. 473 // we should never hit this case.
479 ASSERT(to_add <= (Smi::kMaxValue - len)); 474 ASSERT(to_add <= (Smi::kMaxValue - len));
480 475
481 int new_length = len + to_add; 476 int new_length = len + to_add;
482 477
483 FixedDoubleArray* new_elms; 478 Handle<FixedDoubleArray> new_elms;
484 479
485 if (new_length > elms_len) { 480 if (new_length > elms_len) {
486 // New backing storage is needed. 481 // New backing storage is needed.
487 int capacity = new_length + (new_length >> 1) + 16; 482 int capacity = new_length + (new_length >> 1) + 16;
488 MaybeObject* maybe_obj = 483 new_elms = isolate->factory()->NewFixedDoubleArray(capacity);
489 heap->AllocateUninitializedFixedDoubleArray(capacity);
490 if (!maybe_obj->To(&new_elms)) return maybe_obj;
491 484
492 ElementsAccessor* accessor = array->GetElementsAccessor(); 485 ElementsAccessor* accessor = array->GetElementsAccessor();
493 MaybeObject* maybe_failure = accessor->CopyElements( 486 accessor->CopyElements(
494 NULL, 0, kind, new_elms, 0, 487 Handle<JSObject>::null(), 0, kind, new_elms, 0,
495 ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj); 488 ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
496 ASSERT(!maybe_failure->IsFailure()); 489
497 USE(maybe_failure);
498 } else { 490 } else {
499 // to_add is > 0 and new_length <= elms_len, so elms_obj cannot be the 491 // to_add is > 0 and new_length <= elms_len, so elms_obj cannot be the
500 // empty_fixed_array. 492 // empty_fixed_array.
501 new_elms = FixedDoubleArray::cast(elms_obj); 493 new_elms = Handle<FixedDoubleArray>::cast(elms_obj);
502 } 494 }
503 495
504 // Add the provided values. 496 // Add the provided values.
505 DisallowHeapAllocation no_gc; 497 DisallowHeapAllocation no_gc;
506 int index; 498 int index;
507 for (index = 0; index < to_add; index++) { 499 for (index = 0; index < to_add; index++) {
508 Object* arg = args[index + 1]; 500 Object* arg = args[index + 1];
509 new_elms->set(index + len, arg->Number()); 501 new_elms->set(index + len, arg->Number());
510 } 502 }
511 503
512 if (new_elms != array->elements()) { 504 if (*new_elms != array->elements()) {
513 array->set_elements(new_elms); 505 array->set_elements(*new_elms);
514 } 506 }
515 507
516 // Set the length. 508 // Set the length.
517 array->set_length(Smi::FromInt(new_length)); 509 array->set_length(Smi::FromInt(new_length));
518 return Smi::FromInt(new_length); 510 return Smi::FromInt(new_length);
519 } 511 }
520 } 512 }
521 513
522 514
523 // TODO(ishell): Temporary wrapper until handlified. 515 // TODO(ishell): Temporary wrapper until handlified.
(...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1782 } 1774 }
1783 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) 1775 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
1784 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) 1776 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
1785 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 1777 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
1786 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 1778 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
1787 #undef DEFINE_BUILTIN_ACCESSOR_C 1779 #undef DEFINE_BUILTIN_ACCESSOR_C
1788 #undef DEFINE_BUILTIN_ACCESSOR_A 1780 #undef DEFINE_BUILTIN_ACCESSOR_A
1789 1781
1790 1782
1791 } } // namespace v8::internal 1783 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/elements.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698