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

Side by Side Diff: src/builtins.cc

Issue 206423002: ArrayShift 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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 Handle<Object> receiver, 360 Handle<Object> receiver,
361 Arguments* args, 361 Arguments* args,
362 int first_added_arg) { 362 int first_added_arg) {
363 CALL_HEAP_FUNCTION(isolate, 363 CALL_HEAP_FUNCTION(isolate,
364 EnsureJSArrayWithWritableFastElements( 364 EnsureJSArrayWithWritableFastElements(
365 isolate->heap(), *receiver, args, first_added_arg), 365 isolate->heap(), *receiver, args, first_added_arg),
366 Object); 366 Object);
367 } 367 }
368 368
369 369
370 // TODO(ishell): Handlify when all Array* builtins are handlified.
370 static inline bool IsJSArrayFastElementMovingAllowed(Heap* heap, 371 static inline bool IsJSArrayFastElementMovingAllowed(Heap* heap,
371 JSArray* receiver) { 372 JSArray* receiver) {
372 if (!FLAG_clever_optimizations) return false; 373 if (!FLAG_clever_optimizations) return false;
373 Context* native_context = heap->isolate()->context()->native_context(); 374 Context* native_context = heap->isolate()->context()->native_context();
374 JSObject* array_proto = 375 JSObject* array_proto =
375 JSObject::cast(native_context->array_function()->prototype()); 376 JSObject::cast(native_context->array_function()->prototype());
376 return receiver->GetPrototype() == array_proto && 377 return receiver->GetPrototype() == array_proto &&
377 ArrayPrototypeHasNoElements(heap, native_context, array_proto); 378 ArrayPrototypeHasNoElements(heap, native_context, array_proto);
378 } 379 }
379 380
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 } 577 }
577 RETURN_IF_EMPTY_HANDLE(isolate, element); 578 RETURN_IF_EMPTY_HANDLE(isolate, element);
578 RETURN_IF_EMPTY_HANDLE(isolate, 579 RETURN_IF_EMPTY_HANDLE(isolate,
579 accessor->SetLength( 580 accessor->SetLength(
580 array, handle(Smi::FromInt(new_length), isolate))); 581 array, handle(Smi::FromInt(new_length), isolate)));
581 return *element; 582 return *element;
582 } 583 }
583 584
584 585
585 BUILTIN(ArrayShift) { 586 BUILTIN(ArrayShift) {
587 HandleScope scope(isolate);
586 Heap* heap = isolate->heap(); 588 Heap* heap = isolate->heap();
587 Object* receiver = *args.receiver(); 589 Handle<Object> receiver = args.receiver();
588 FixedArrayBase* elms_obj; 590 Handle<Object> elms_or_null =
589 MaybeObject* maybe_elms_obj = 591 EnsureJSArrayWithWritableFastElementsWrapper(isolate, receiver, NULL, 0);
590 EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0); 592 RETURN_IF_EMPTY_HANDLE(isolate, elms_or_null);
591 if (maybe_elms_obj == NULL) 593 if ((*elms_or_null == NULL) ||
592 return CallJsBuiltin(isolate, "ArrayShift", args); 594 !IsJSArrayFastElementMovingAllowed(heap,
593 if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj; 595 *Handle<JSArray>::cast(receiver))) {
594
595 if (!IsJSArrayFastElementMovingAllowed(heap, JSArray::cast(receiver))) {
596 return CallJsBuiltin(isolate, "ArrayShift", args); 596 return CallJsBuiltin(isolate, "ArrayShift", args);
597 } 597 }
598 JSArray* array = JSArray::cast(receiver); 598 Handle<FixedArrayBase> elms_obj = Handle<FixedArrayBase>::cast(elms_or_null);
599 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
599 ASSERT(!array->map()->is_observed()); 600 ASSERT(!array->map()->is_observed());
600 601
601 int len = Smi::cast(array->length())->value(); 602 int len = Smi::cast(array->length())->value();
602 if (len == 0) return heap->undefined_value(); 603 if (len == 0) return heap->undefined_value();
603 604
604 // Get first element 605 // Get first element
605 ElementsAccessor* accessor = array->GetElementsAccessor(); 606 ElementsAccessor* accessor = array->GetElementsAccessor();
606 Object* first; 607 Handle<Object> first = accessor->Get(receiver, array, 0, elms_obj);
607 MaybeObject* maybe_first = accessor->Get(receiver, array, 0, elms_obj);
608 if (!maybe_first->To(&first)) return maybe_first;
609 if (first->IsTheHole()) { 608 if (first->IsTheHole()) {
610 first = heap->undefined_value(); 609 first = isolate->factory()->undefined_value();
611 } 610 }
612 611
613 if (!heap->lo_space()->Contains(elms_obj)) { 612 if (!heap->lo_space()->Contains(*elms_obj)) {
614 array->set_elements(LeftTrimFixedArray(heap, elms_obj, 1)); 613 array->set_elements(LeftTrimFixedArray(heap, *elms_obj, 1));
615 } else { 614 } else {
616 // Shift the elements. 615 // Shift the elements.
617 if (elms_obj->IsFixedArray()) { 616 if (elms_obj->IsFixedArray()) {
618 FixedArray* elms = FixedArray::cast(elms_obj); 617 Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj);
619 DisallowHeapAllocation no_gc; 618 DisallowHeapAllocation no_gc;
620 heap->MoveElements(elms, 0, 1, len - 1); 619 heap->MoveElements(*elms, 0, 1, len - 1);
621 elms->set(len - 1, heap->the_hole_value()); 620 elms->set(len - 1, heap->the_hole_value());
622 } else { 621 } else {
623 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); 622 Handle<FixedDoubleArray> elms = Handle<FixedDoubleArray>::cast(elms_obj);
624 MoveDoubleElements(elms, 0, elms, 1, len - 1); 623 MoveDoubleElements(*elms, 0, *elms, 1, len - 1);
625 elms->set_the_hole(len - 1); 624 elms->set_the_hole(len - 1);
626 } 625 }
627 } 626 }
628 627
629 // Set the length. 628 // Set the length.
630 array->set_length(Smi::FromInt(len - 1)); 629 array->set_length(Smi::FromInt(len - 1));
631 630
632 return first; 631 return *first;
633 } 632 }
634 633
635 634
636 BUILTIN(ArrayUnshift) { 635 BUILTIN(ArrayUnshift) {
637 Heap* heap = isolate->heap(); 636 Heap* heap = isolate->heap();
638 Object* receiver = *args.receiver(); 637 Object* receiver = *args.receiver();
639 FixedArrayBase* elms_obj; 638 FixedArrayBase* elms_obj;
640 MaybeObject* maybe_elms_obj = 639 MaybeObject* maybe_elms_obj =
641 EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0); 640 EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
642 if (maybe_elms_obj == NULL) 641 if (maybe_elms_obj == NULL)
(...skipping 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1782 } 1781 }
1783 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) 1782 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
1784 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) 1783 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
1785 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 1784 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
1786 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 1785 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
1787 #undef DEFINE_BUILTIN_ACCESSOR_C 1786 #undef DEFINE_BUILTIN_ACCESSOR_C
1788 #undef DEFINE_BUILTIN_ACCESSOR_A 1787 #undef DEFINE_BUILTIN_ACCESSOR_A
1789 1788
1790 1789
1791 } } // namespace v8::internal 1790 } } // 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