| Index: src/runtime.cc
|
| ===================================================================
|
| --- src/runtime.cc (revision 2544)
|
| +++ src/runtime.cc (working copy)
|
| @@ -155,33 +155,43 @@
|
| }
|
|
|
| // Deep copy local elements.
|
| - if (copy->HasFastElements()) {
|
| - FixedArray* elements = copy->elements();
|
| - WriteBarrierMode mode = elements->GetWriteBarrierMode();
|
| - for (int i = 0; i < elements->length(); i++) {
|
| - Object* value = elements->get(i);
|
| - if (value->IsJSObject()) {
|
| - JSObject* jsObject = JSObject::cast(value);
|
| - result = DeepCopyBoilerplate(jsObject);
|
| - if (result->IsFailure()) return result;
|
| - elements->set(i, result, mode);
|
| - }
|
| - }
|
| - } else {
|
| - NumberDictionary* element_dictionary = copy->element_dictionary();
|
| - int capacity = element_dictionary->Capacity();
|
| - for (int i = 0; i < capacity; i++) {
|
| - Object* k = element_dictionary->KeyAt(i);
|
| - if (element_dictionary->IsKey(k)) {
|
| - Object* value = element_dictionary->ValueAt(i);
|
| + // Pixel elements cannot be created using an object literal.
|
| + ASSERT(!copy->HasPixelElements());
|
| + switch (copy->GetElementsKind()) {
|
| + case JSObject::FAST_ELEMENTS: {
|
| + FixedArray* elements = FixedArray::cast(copy->elements());
|
| + WriteBarrierMode mode = elements->GetWriteBarrierMode();
|
| + for (int i = 0; i < elements->length(); i++) {
|
| + Object* value = elements->get(i);
|
| if (value->IsJSObject()) {
|
| JSObject* jsObject = JSObject::cast(value);
|
| result = DeepCopyBoilerplate(jsObject);
|
| if (result->IsFailure()) return result;
|
| - element_dictionary->ValueAtPut(i, result);
|
| + elements->set(i, result, mode);
|
| }
|
| }
|
| + break;
|
| }
|
| + case JSObject::DICTIONARY_ELEMENTS: {
|
| + NumberDictionary* element_dictionary = copy->element_dictionary();
|
| + int capacity = element_dictionary->Capacity();
|
| + for (int i = 0; i < capacity; i++) {
|
| + Object* k = element_dictionary->KeyAt(i);
|
| + if (element_dictionary->IsKey(k)) {
|
| + Object* value = element_dictionary->ValueAt(i);
|
| + if (value->IsJSObject()) {
|
| + JSObject* jsObject = JSObject::cast(value);
|
| + result = DeepCopyBoilerplate(jsObject);
|
| + if (result->IsFailure()) return result;
|
| + element_dictionary->ValueAtPut(i, result);
|
| + }
|
| + }
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + UNREACHABLE();
|
| + break;
|
| }
|
| return copy;
|
| }
|
| @@ -1637,7 +1647,7 @@
|
| }
|
| case SUBJECT_CAPTURE: {
|
| int capture = part.data;
|
| - FixedArray* match_info = last_match_info->elements();
|
| + FixedArray* match_info = FixedArray::cast(last_match_info->elements());
|
| int from = RegExpImpl::GetCapture(match_info, capture * 2);
|
| int to = RegExpImpl::GetCapture(match_info, capture * 2 + 1);
|
| if (from >= 0 && to > from) {
|
| @@ -1717,7 +1727,8 @@
|
| int start, end;
|
| {
|
| AssertNoAllocation match_info_array_is_not_in_a_handle;
|
| - FixedArray* match_info_array = last_match_info_handle->elements();
|
| + FixedArray* match_info_array =
|
| + FixedArray::cast(last_match_info_handle->elements());
|
|
|
| ASSERT_EQ(capture_count * 2 + 2,
|
| RegExpImpl::GetLastCaptureCount(match_info_array));
|
| @@ -2345,7 +2356,7 @@
|
| int end;
|
| {
|
| AssertNoAllocation no_alloc;
|
| - FixedArray* elements = regexp_info->elements();
|
| + FixedArray* elements = FixedArray::cast(regexp_info->elements());
|
| start = Smi::cast(elements->get(RegExpImpl::kFirstCapture))->value();
|
| end = Smi::cast(elements->get(RegExpImpl::kFirstCapture + 1))->value();
|
| }
|
| @@ -4885,7 +4896,7 @@
|
|
|
| AssertNoAllocation no_allocation;
|
|
|
| - FixedArray* output_array = output->elements();
|
| + FixedArray* output_array = FixedArray::cast(output->elements());
|
| RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE);
|
| bool result;
|
| if (str->IsAsciiRepresentation()) {
|
| @@ -5173,37 +5184,62 @@
|
| ArrayConcatVisitor* visitor) {
|
| uint32_t num_of_elements = 0;
|
|
|
| - if (receiver->HasFastElements()) {
|
| - Handle<FixedArray> elements(FixedArray::cast(receiver->elements()));
|
| - uint32_t len = elements->length();
|
| - if (range < len) len = range;
|
| + switch (receiver->GetElementsKind()) {
|
| + case JSObject::FAST_ELEMENTS: {
|
| + Handle<FixedArray> elements(FixedArray::cast(receiver->elements()));
|
| + uint32_t len = elements->length();
|
| + if (range < len) {
|
| + len = range;
|
| + }
|
| +
|
| + for (uint32_t j = 0; j < len; j++) {
|
| + Handle<Object> e(elements->get(j));
|
| + if (!e->IsTheHole()) {
|
| + num_of_elements++;
|
| + if (visitor) {
|
| + visitor->visit(j, e);
|
| + }
|
| + }
|
| + }
|
| + break;
|
| + }
|
| + case JSObject::PIXEL_ELEMENTS: {
|
| + Handle<PixelArray> pixels(PixelArray::cast(receiver->elements()));
|
| + uint32_t len = pixels->length();
|
| + if (range < len) {
|
| + len = range;
|
| + }
|
|
|
| - for (uint32_t j = 0; j < len; j++) {
|
| - Handle<Object> e(elements->get(j));
|
| - if (!e->IsTheHole()) {
|
| + for (uint32_t j = 0; j < len; j++) {
|
| num_of_elements++;
|
| - if (visitor)
|
| + if (visitor != NULL) {
|
| + Handle<Smi> e(Smi::FromInt(pixels->get(j)));
|
| visitor->visit(j, e);
|
| + }
|
| }
|
| + break;
|
| }
|
| -
|
| - } else {
|
| - Handle<NumberDictionary> dict(receiver->element_dictionary());
|
| - uint32_t capacity = dict->Capacity();
|
| - for (uint32_t j = 0; j < capacity; j++) {
|
| - Handle<Object> k(dict->KeyAt(j));
|
| - if (dict->IsKey(*k)) {
|
| - ASSERT(k->IsNumber());
|
| - uint32_t index = static_cast<uint32_t>(k->Number());
|
| - if (index < range) {
|
| - num_of_elements++;
|
| - if (visitor) {
|
| - visitor->visit(index,
|
| - Handle<Object>(dict->ValueAt(j)));
|
| + case JSObject::DICTIONARY_ELEMENTS: {
|
| + Handle<NumberDictionary> dict(receiver->element_dictionary());
|
| + uint32_t capacity = dict->Capacity();
|
| + for (uint32_t j = 0; j < capacity; j++) {
|
| + Handle<Object> k(dict->KeyAt(j));
|
| + if (dict->IsKey(*k)) {
|
| + ASSERT(k->IsNumber());
|
| + uint32_t index = static_cast<uint32_t>(k->Number());
|
| + if (index < range) {
|
| + num_of_elements++;
|
| + if (visitor) {
|
| + visitor->visit(index, Handle<Object>(dict->ValueAt(j)));
|
| + }
|
| }
|
| }
|
| }
|
| + break;
|
| }
|
| + default:
|
| + UNREACHABLE();
|
| + break;
|
| }
|
|
|
| return num_of_elements;
|
| @@ -7449,7 +7485,7 @@
|
| Address pc = frame->pc();
|
| Address start = frame->code()->address();
|
| Smi* offset = Smi::FromInt(pc - start);
|
| - FixedArray* elements = result->elements();
|
| + FixedArray* elements = FixedArray::cast(result->elements());
|
| if (cursor + 2 < elements->length()) {
|
| elements->set(cursor++, recv);
|
| elements->set(cursor++, fun);
|
|
|