Version 3.25.25 (based on bleeding_edge revision r20239)
Roll ICU 239289:258359 and add support for external ICU data tables (issue 3142, Chromium issue 72633).
Performance and stability improvements on all platforms.
git-svn-id: http://v8.googlecode.com/svn/trunk@20247 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/src/builtins.cc b/src/builtins.cc
index b73ed6b..e460a8f 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -506,23 +506,7 @@
uint32_t key,
Handle<FixedArrayBase> backing_store = Handle<FixedArrayBase>::null()) {
return accessor->HasElement(*receiver, *holder, key,
- backing_store.is_null() ? *backing_store : NULL);
-}
-
-
-// TODO(ishell): Temporary wrapper until handlified.
-static Handle<Object> ElementsAccessorGetWrapper(
- Isolate* isolate,
- ElementsAccessor* accessor,
- Handle<Object> receiver,
- Handle<JSObject> holder,
- uint32_t key,
- Handle<FixedArrayBase> backing_store = Handle<FixedArrayBase>::null()) {
- CALL_HEAP_FUNCTION(isolate,
- accessor->Get(*receiver, *holder, key,
- backing_store.is_null()
- ? *backing_store : NULL),
- Object);
+ backing_store.is_null() ? NULL : *backing_store);
}
@@ -544,8 +528,8 @@
Handle<Object> element;
if (ElementsAccessorHasElementWrapper(
accessor, array, array, new_length, elms_obj)) {
- element = ElementsAccessorGetWrapper(
- isolate, accessor, array, array, new_length, elms_obj);
+ element = accessor->Get(
+ array, array, new_length, elms_obj);
} else {
Handle<Object> proto(array->GetPrototype(), isolate);
element = Object::GetElement(isolate, proto, len - 1);
@@ -578,11 +562,12 @@
// Get first element
ElementsAccessor* accessor = array->GetElementsAccessor();
Handle<Object> first = accessor->Get(receiver, array, 0, elms_obj);
+ RETURN_IF_EMPTY_HANDLE(isolate, first);
if (first->IsTheHole()) {
first = isolate->factory()->undefined_value();
}
- if (!heap->lo_space()->Contains(*elms_obj)) {
+ if (!heap->CanMoveObjectStart(*elms_obj)) {
array->set_elements(LeftTrimFixedArray(heap, *elms_obj, 1));
} else {
// Shift the elements.
@@ -906,8 +891,24 @@
heap->MoveElements(*elms, delta, 0, actual_start);
}
- elms_obj = handle(LeftTrimFixedArray(heap, *elms_obj, delta));
-
+ if (heap->CanMoveObjectStart(*elms_obj)) {
+ // On the fast path we move the start of the object in memory.
+ elms_obj = handle(LeftTrimFixedArray(heap, *elms_obj, delta));
+ } else {
+ // This is the slow path. We are going to move the elements to the left
+ // by copying them. For trimmed values we store the hole.
+ if (elms_obj->IsFixedDoubleArray()) {
+ Handle<FixedDoubleArray> elms =
+ Handle<FixedDoubleArray>::cast(elms_obj);
+ MoveDoubleElements(*elms, 0, *elms, delta, len - delta);
+ FillWithHoles(*elms, len - delta, len);
+ } else {
+ Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj);
+ DisallowHeapAllocation no_gc;
+ heap->MoveElements(*elms, 0, delta, len - delta);
+ FillWithHoles(heap, *elms, len - delta, len);
+ }
+ }
elms_changed = true;
} else {
if (elms_obj->IsFixedDoubleArray()) {