From 92fc85b48038c7b6876a2f536cf9a2a67f126eff Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Wed, 20 Jul 2011 13:41:50 +0000 Subject: [PATCH] Implement support for getters/setter on FixedDoubleArrays. R=ager@chromium.org BUG=none TEST=none Review URL: http://codereview.chromium.org/7459009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8696 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects.cc | 22 ++++++++++++----- test/mjsunit/unbox-double-arrays.js | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index 341f929..fcfbd1c 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -3656,6 +3656,7 @@ MaybeObject* JSObject::DefineGetterSetter(String* name, if (is_element) { switch (GetElementsKind()) { case FAST_ELEMENTS: + case FAST_DOUBLE_ELEMENTS: break; case EXTERNAL_PIXEL_ELEMENTS: case EXTERNAL_BYTE_ELEMENTS: @@ -3666,7 +3667,6 @@ MaybeObject* JSObject::DefineGetterSetter(String* name, case EXTERNAL_UNSIGNED_INT_ELEMENTS: case EXTERNAL_FLOAT_ELEMENTS: case EXTERNAL_DOUBLE_ELEMENTS: - case FAST_DOUBLE_ELEMENTS: // Ignore getters and setters on pixel and external array // elements. return heap->undefined_value(); @@ -3905,6 +3905,7 @@ MaybeObject* JSObject::DefineAccessor(AccessorInfo* info) { // Accessors overwrite previous callbacks (cf. with getters/setters). switch (GetElementsKind()) { case FAST_ELEMENTS: + case FAST_DOUBLE_ELEMENTS: break; case EXTERNAL_PIXEL_ELEMENTS: case EXTERNAL_BYTE_ELEMENTS: @@ -3915,7 +3916,6 @@ MaybeObject* JSObject::DefineAccessor(AccessorInfo* info) { case EXTERNAL_UNSIGNED_INT_ELEMENTS: case EXTERNAL_FLOAT_ELEMENTS: case EXTERNAL_DOUBLE_ELEMENTS: - case FAST_DOUBLE_ELEMENTS: // Ignore getters and setters on pixel and external array // elements. return isolate->heap()->undefined_value(); @@ -4688,6 +4688,9 @@ MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { switch (array->GetElementsKind()) { case JSObject::FAST_ELEMENTS: return UnionOfKeys(FixedArray::cast(array->elements())); + case JSObject::FAST_DOUBLE_ELEMENTS: + UNIMPLEMENTED(); + break; case JSObject::DICTIONARY_ELEMENTS: { NumberDictionary* dict = array->element_dictionary(); int size = dict->NumberOfElements(); @@ -4722,7 +4725,6 @@ MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { case JSObject::EXTERNAL_FLOAT_ELEMENTS: case JSObject::EXTERNAL_DOUBLE_ELEMENTS: case JSObject::EXTERNAL_PIXEL_ELEMENTS: - case JSObject::FAST_DOUBLE_ELEMENTS: break; } UNREACHABLE(); @@ -8038,6 +8040,17 @@ JSObject::LocalElementType JSObject::HasLocalElement(uint32_t index) { } break; } + case FAST_DOUBLE_ELEMENTS: { + uint32_t length = IsJSArray() ? + static_cast + (Smi::cast(JSArray::cast(this)->length())->value()) : + static_cast(FixedDoubleArray::cast(elements())->length()); + if ((index < length) && + !FixedDoubleArray::cast(elements())->is_the_hole(index)) { + return FAST_ELEMENT; + } + break; + } case EXTERNAL_PIXEL_ELEMENTS: { ExternalPixelArray* pixels = ExternalPixelArray::cast(elements()); if (index < static_cast(pixels->length())) return FAST_ELEMENT; @@ -8055,9 +8068,6 @@ JSObject::LocalElementType JSObject::HasLocalElement(uint32_t index) { if (index < static_cast(array->length())) return FAST_ELEMENT; break; } - case FAST_DOUBLE_ELEMENTS: - UNREACHABLE(); - break; case DICTIONARY_ELEMENTS: { if (element_dictionary()->FindEntry(index) != NumberDictionary::kNotFound) { diff --git a/test/mjsunit/unbox-double-arrays.js b/test/mjsunit/unbox-double-arrays.js index 351765e..2d85893 100644 --- a/test/mjsunit/unbox-double-arrays.js +++ b/test/mjsunit/unbox-double-arrays.js @@ -466,3 +466,51 @@ test_for_in(); test_for_in(); test_for_in(); test_for_in(); + +// Test elements getters. +assertEquals(expected_array_value(10), large_array3[10]); +assertEquals(expected_array_value(-NaN), large_array3[2]); +large_array3.__defineGetter__("2", function(){ + return expected_array_value(10); +}); + +function test_getter() { + assertEquals(expected_array_value(10), large_array3[10]); + assertEquals(expected_array_value(10), large_array3[2]); +} + +test_getter(); +test_getter(); +test_getter(); +%OptimizeFunctionOnNextCall(test_getter); +test_getter(); +test_getter(); +test_getter(); + +// Test element setters. +large_array4 = new Array(large_array_size); +force_to_fast_double_array(large_array4); + +var setter_called = false; + +assertEquals(expected_array_value(10), large_array4[10]); +assertEquals(expected_array_value(2), large_array4[2]); +large_array4.__defineSetter__("10", function(value){ + setter_called = true; + }); + +function test_setter() { + setter_called = false; + large_array4[10] = 119; + assertTrue(setter_called); + assertEquals(undefined, large_array4[10]); + assertEquals(expected_array_value(2), large_array4[2]); +} + +test_setter(); +test_setter(); +test_setter(); +%OptimizeFunctionOnNextCall(test_setter); +test_setter(); +test_setter(); +test_setter(); -- 2.7.4