Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 706 return context->string_function()->instance_prototype(); | 706 return context->string_function()->instance_prototype(); |
| 707 } | 707 } |
| 708 if (heap_object->IsBoolean()) { | 708 if (heap_object->IsBoolean()) { |
| 709 return context->boolean_function()->instance_prototype(); | 709 return context->boolean_function()->instance_prototype(); |
| 710 } else { | 710 } else { |
| 711 return heap->null_value(); | 711 return heap->null_value(); |
| 712 } | 712 } |
| 713 } | 713 } |
| 714 | 714 |
| 715 | 715 |
| 716 void Object::MiniPrint() { | |
| 717 if (IsSmi()) { | |
| 718 PrintF("%d", Smi::cast(this)->value()); | |
| 719 } else if (IsString() || IsSymbol()) { | |
| 720 String::cast(this)->MiniPrint(); | |
| 721 } else if (IsNumber()) { | |
| 722 PrintF("%g", Number()); | |
| 723 } else if (IsFailure()) { | |
| 724 PrintF("<failure>"); | |
| 725 } else if (IsUndefined()) { | |
| 726 PrintF("<undefined>"); | |
| 727 } else if (IsNull()) { | |
| 728 PrintF("<null>"); | |
| 729 } else if (IsTrue()) { | |
| 730 PrintF("<true>"); | |
| 731 } else if (IsFalse()) { | |
| 732 PrintF("<false>"); | |
| 733 } else { | |
| 734 PrintF("%p", reinterpret_cast<void*>(this)); | |
| 735 } | |
| 736 } | |
| 737 | |
| 738 | |
| 716 void Object::ShortPrint(FILE* out) { | 739 void Object::ShortPrint(FILE* out) { |
| 717 HeapStringAllocator allocator; | 740 HeapStringAllocator allocator; |
| 718 StringStream accumulator(&allocator); | 741 StringStream accumulator(&allocator); |
| 719 ShortPrint(&accumulator); | 742 ShortPrint(&accumulator); |
| 720 accumulator.OutputToFile(out); | 743 accumulator.OutputToFile(out); |
| 721 } | 744 } |
| 722 | 745 |
| 723 | 746 |
| 724 void Object::ShortPrint(StringStream* accumulator) { | 747 void Object::ShortPrint(StringStream* accumulator) { |
| 725 if (IsSmi()) { | 748 if (IsSmi()) { |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 939 int new_size = this->Size(); // Byte size of the external String object. | 962 int new_size = this->Size(); // Byte size of the external String object. |
| 940 heap->CreateFillerObjectAt(this->address() + new_size, size - new_size); | 963 heap->CreateFillerObjectAt(this->address() + new_size, size - new_size); |
| 941 if (Marking::IsBlack(Marking::MarkBitFrom(this))) { | 964 if (Marking::IsBlack(Marking::MarkBitFrom(this))) { |
| 942 MemoryChunk::IncrementLiveBytes(this->address(), new_size - size); | 965 MemoryChunk::IncrementLiveBytes(this->address(), new_size - size); |
| 943 } | 966 } |
| 944 | 967 |
| 945 return true; | 968 return true; |
| 946 } | 969 } |
| 947 | 970 |
| 948 | 971 |
| 972 void String::MiniPrint() { | |
| 973 // not uncommon to have empty strings | |
| 974 if (length() > 0) { | |
| 975 SmartArrayPointer<char> s = | |
| 976 ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | |
| 977 PrintF("%s", *s); | |
| 978 } | |
| 979 } | |
| 980 | |
| 981 | |
| 949 void String::StringShortPrint(StringStream* accumulator) { | 982 void String::StringShortPrint(StringStream* accumulator) { |
| 950 int len = length(); | 983 int len = length(); |
| 951 if (len > kMaxShortPrintLength) { | 984 if (len > kMaxShortPrintLength) { |
| 952 accumulator->Add("<Very long string[%u]>", len); | 985 accumulator->Add("<Very long string[%u]>", len); |
| 953 return; | 986 return; |
| 954 } | 987 } |
| 955 | 988 |
| 956 if (!LooksValid()) { | 989 if (!LooksValid()) { |
| 957 accumulator->Add("<Invalid String>"); | 990 accumulator->Add("<Invalid String>"); |
| 958 return; | 991 return; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1080 accumulator->Add(" value = "); | 1113 accumulator->Add(" value = "); |
| 1081 JSValue::cast(this)->value()->ShortPrint(accumulator); | 1114 JSValue::cast(this)->value()->ShortPrint(accumulator); |
| 1082 } | 1115 } |
| 1083 accumulator->Put('>'); | 1116 accumulator->Put('>'); |
| 1084 break; | 1117 break; |
| 1085 } | 1118 } |
| 1086 } | 1119 } |
| 1087 } | 1120 } |
| 1088 | 1121 |
| 1089 | 1122 |
| 1123 void JSObject::PrintElementsTransition( | |
| 1124 FILE* file, ElementsKind from_kind, FixedArrayBase* from_elements, | |
| 1125 ElementsKind to_kind, FixedArrayBase* to_elements) { | |
| 1126 PrintF("elements transition ["); | |
|
Jakob Kummerow
2011/10/19 16:02:28
It doesn't make a difference for the current usage
danno
2011/10/20 08:51:17
Done.
| |
| 1127 PrintElementsKind(file, from_kind); | |
| 1128 PrintF(" -> "); | |
| 1129 PrintElementsKind(file, to_kind); | |
| 1130 PrintF("] in "); | |
| 1131 JavaScriptFrame::PrintTop(false, true); | |
| 1132 PrintF(" for "); | |
| 1133 ShortPrint(file); | |
| 1134 PrintF(" from "); | |
| 1135 from_elements->ShortPrint(file); | |
| 1136 PrintF(" to "); | |
| 1137 to_elements->ShortPrint(file); | |
| 1138 PrintF("\n"); | |
| 1139 } | |
| 1140 | |
| 1141 | |
| 1090 void HeapObject::HeapObjectShortPrint(StringStream* accumulator) { | 1142 void HeapObject::HeapObjectShortPrint(StringStream* accumulator) { |
| 1091 Heap* heap = GetHeap(); | 1143 Heap* heap = GetHeap(); |
| 1092 if (!heap->Contains(this)) { | 1144 if (!heap->Contains(this)) { |
| 1093 accumulator->Add("!!!INVALID POINTER!!!"); | 1145 accumulator->Add("!!!INVALID POINTER!!!"); |
| 1094 return; | 1146 return; |
| 1095 } | 1147 } |
| 1096 if (!heap->Contains(map())) { | 1148 if (!heap->Contains(map())) { |
| 1097 accumulator->Add("!!!INVALID MAP!!!"); | 1149 accumulator->Add("!!!INVALID MAP!!!"); |
| 1098 return; | 1150 return; |
| 1099 } | 1151 } |
| 1100 | 1152 |
| 1101 accumulator->Add("%p ", this); | 1153 accumulator->Add("%p ", this); |
| 1102 | 1154 |
| 1103 if (IsString()) { | 1155 if (IsString()) { |
| 1104 String::cast(this)->StringShortPrint(accumulator); | 1156 String::cast(this)->StringShortPrint(accumulator); |
| 1105 return; | 1157 return; |
| 1106 } | 1158 } |
| 1107 if (IsJSObject()) { | 1159 if (IsJSObject()) { |
| 1108 JSObject::cast(this)->JSObjectShortPrint(accumulator); | 1160 JSObject::cast(this)->JSObjectShortPrint(accumulator); |
| 1109 return; | 1161 return; |
| 1110 } | 1162 } |
| 1111 switch (map()->instance_type()) { | 1163 switch (map()->instance_type()) { |
| 1112 case MAP_TYPE: | 1164 case MAP_TYPE: |
| 1113 accumulator->Add("<Map(elements=%u)>", Map::cast(this)->elements_kind()); | 1165 accumulator->Add("<Map(elements=%u)>", Map::cast(this)->elements_kind()); |
| 1114 break; | 1166 break; |
| 1115 case FIXED_ARRAY_TYPE: | 1167 case FIXED_ARRAY_TYPE: |
| 1116 accumulator->Add("<FixedArray[%u]>", FixedArray::cast(this)->length()); | 1168 accumulator->Add("<FixedArray[%u]>", FixedArray::cast(this)->length()); |
| 1117 break; | 1169 break; |
| 1170 case FIXED_DOUBLE_ARRAY_TYPE: | |
| 1171 accumulator->Add("<FixedDoubleArray[%u]>", | |
| 1172 FixedDoubleArray::cast(this)->length()); | |
| 1173 break; | |
| 1118 case BYTE_ARRAY_TYPE: | 1174 case BYTE_ARRAY_TYPE: |
| 1119 accumulator->Add("<ByteArray[%u]>", ByteArray::cast(this)->length()); | 1175 accumulator->Add("<ByteArray[%u]>", ByteArray::cast(this)->length()); |
| 1120 break; | 1176 break; |
| 1121 case FREE_SPACE_TYPE: | 1177 case FREE_SPACE_TYPE: |
| 1122 accumulator->Add("<FreeSpace[%u]>", FreeSpace::cast(this)->Size()); | 1178 accumulator->Add("<FreeSpace[%u]>", FreeSpace::cast(this)->Size()); |
| 1123 break; | 1179 break; |
| 1124 case EXTERNAL_PIXEL_ARRAY_TYPE: | 1180 case EXTERNAL_PIXEL_ARRAY_TYPE: |
| 1125 accumulator->Add("<ExternalPixelArray[%u]>", | 1181 accumulator->Add("<ExternalPixelArray[%u]>", |
| 1126 ExternalPixelArray::cast(this)->length()); | 1182 ExternalPixelArray::cast(this)->length()); |
| 1127 break; | 1183 break; |
| (...skipping 6802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7930 (elements()->map()->has_fast_smi_only_elements() || | 7986 (elements()->map()->has_fast_smi_only_elements() || |
| 7931 elements() == heap->empty_fixed_array()); | 7987 elements() == heap->empty_fixed_array()); |
| 7932 ElementsKind elements_kind = has_fast_smi_only_elements | 7988 ElementsKind elements_kind = has_fast_smi_only_elements |
| 7933 ? FAST_SMI_ONLY_ELEMENTS | 7989 ? FAST_SMI_ONLY_ELEMENTS |
| 7934 : FAST_ELEMENTS; | 7990 : FAST_ELEMENTS; |
| 7935 MaybeObject* maybe = GetElementsTransitionMap(elements_kind); | 7991 MaybeObject* maybe = GetElementsTransitionMap(elements_kind); |
| 7936 if (!maybe->ToObject(&object)) return maybe; | 7992 if (!maybe->ToObject(&object)) return maybe; |
| 7937 new_map = Map::cast(object); | 7993 new_map = Map::cast(object); |
| 7938 } | 7994 } |
| 7939 | 7995 |
| 7996 FixedArrayBase* old_elements_raw = elements(); | |
| 7940 ElementsKind elements_kind = GetElementsKind(); | 7997 ElementsKind elements_kind = GetElementsKind(); |
| 7941 switch (elements_kind) { | 7998 switch (elements_kind) { |
| 7942 case FAST_SMI_ONLY_ELEMENTS: | 7999 case FAST_SMI_ONLY_ELEMENTS: |
| 7943 case FAST_ELEMENTS: { | 8000 case FAST_ELEMENTS: { |
| 7944 AssertNoAllocation no_gc; | 8001 AssertNoAllocation no_gc; |
| 7945 WriteBarrierMode mode(new_elements->GetWriteBarrierMode(no_gc)); | 8002 WriteBarrierMode mode(new_elements->GetWriteBarrierMode(no_gc)); |
| 7946 CopyFastElementsToFast(FixedArray::cast(elements()), new_elements, mode); | 8003 CopyFastElementsToFast(FixedArray::cast(old_elements_raw), |
| 8004 new_elements, mode); | |
| 7947 set_map(new_map); | 8005 set_map(new_map); |
| 7948 set_elements(new_elements); | 8006 set_elements(new_elements); |
| 7949 break; | 8007 break; |
| 7950 } | 8008 } |
| 7951 case DICTIONARY_ELEMENTS: { | 8009 case DICTIONARY_ELEMENTS: { |
| 7952 AssertNoAllocation no_gc; | 8010 AssertNoAllocation no_gc; |
| 7953 WriteBarrierMode mode = new_elements->GetWriteBarrierMode(no_gc); | 8011 WriteBarrierMode mode = new_elements->GetWriteBarrierMode(no_gc); |
| 7954 CopySlowElementsToFast(NumberDictionary::cast(elements()), | 8012 CopySlowElementsToFast(NumberDictionary::cast(old_elements_raw), |
| 7955 new_elements, | 8013 new_elements, |
| 7956 mode); | 8014 mode); |
| 7957 set_map(new_map); | 8015 set_map(new_map); |
| 7958 set_elements(new_elements); | 8016 set_elements(new_elements); |
| 7959 break; | 8017 break; |
| 7960 } | 8018 } |
| 7961 case NON_STRICT_ARGUMENTS_ELEMENTS: { | 8019 case NON_STRICT_ARGUMENTS_ELEMENTS: { |
| 7962 AssertNoAllocation no_gc; | 8020 AssertNoAllocation no_gc; |
| 7963 WriteBarrierMode mode = new_elements->GetWriteBarrierMode(no_gc); | 8021 WriteBarrierMode mode = new_elements->GetWriteBarrierMode(no_gc); |
| 7964 // The object's map and the parameter map are unchanged, the unaliased | 8022 // The object's map and the parameter map are unchanged, the unaliased |
| 7965 // arguments are copied to the new backing store. | 8023 // arguments are copied to the new backing store. |
| 7966 FixedArray* parameter_map = FixedArray::cast(elements()); | 8024 FixedArray* parameter_map = FixedArray::cast(old_elements_raw); |
| 7967 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 8025 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| 7968 if (arguments->IsDictionary()) { | 8026 if (arguments->IsDictionary()) { |
| 7969 CopySlowElementsToFast(NumberDictionary::cast(arguments), | 8027 CopySlowElementsToFast(NumberDictionary::cast(arguments), |
| 7970 new_elements, | 8028 new_elements, |
| 7971 mode); | 8029 mode); |
| 7972 } else { | 8030 } else { |
| 7973 CopyFastElementsToFast(arguments, new_elements, mode); | 8031 CopyFastElementsToFast(arguments, new_elements, mode); |
| 7974 } | 8032 } |
| 7975 parameter_map->set(1, new_elements); | 8033 parameter_map->set(1, new_elements); |
| 7976 break; | 8034 break; |
| 7977 } | 8035 } |
| 7978 case FAST_DOUBLE_ELEMENTS: { | 8036 case FAST_DOUBLE_ELEMENTS: { |
| 7979 FixedDoubleArray* old_elements = FixedDoubleArray::cast(elements()); | 8037 FixedDoubleArray* old_elements = FixedDoubleArray::cast(old_elements_raw); |
| 7980 uint32_t old_length = static_cast<uint32_t>(old_elements->length()); | 8038 uint32_t old_length = static_cast<uint32_t>(old_elements->length()); |
| 7981 // Fill out the new array with this content and array holes. | 8039 // Fill out the new array with this content and array holes. |
| 7982 for (uint32_t i = 0; i < old_length; i++) { | 8040 for (uint32_t i = 0; i < old_length; i++) { |
| 7983 if (!old_elements->is_the_hole(i)) { | 8041 if (!old_elements->is_the_hole(i)) { |
| 7984 Object* obj; | 8042 Object* obj; |
| 7985 // Objects must be allocated in the old object space, since the | 8043 // Objects must be allocated in the old object space, since the |
| 7986 // overall number of HeapNumbers needed for the conversion might | 8044 // overall number of HeapNumbers needed for the conversion might |
| 7987 // exceed the capacity of new space, and we would fail repeatedly | 8045 // exceed the capacity of new space, and we would fail repeatedly |
| 7988 // trying to convert the FixedDoubleArray. | 8046 // trying to convert the FixedDoubleArray. |
| 7989 MaybeObject* maybe_value_object = | 8047 MaybeObject* maybe_value_object = |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 8007 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 8065 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 8008 case EXTERNAL_INT_ELEMENTS: | 8066 case EXTERNAL_INT_ELEMENTS: |
| 8009 case EXTERNAL_UNSIGNED_INT_ELEMENTS: | 8067 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 8010 case EXTERNAL_FLOAT_ELEMENTS: | 8068 case EXTERNAL_FLOAT_ELEMENTS: |
| 8011 case EXTERNAL_DOUBLE_ELEMENTS: | 8069 case EXTERNAL_DOUBLE_ELEMENTS: |
| 8012 case EXTERNAL_PIXEL_ELEMENTS: | 8070 case EXTERNAL_PIXEL_ELEMENTS: |
| 8013 UNREACHABLE(); | 8071 UNREACHABLE(); |
| 8014 break; | 8072 break; |
| 8015 } | 8073 } |
| 8016 | 8074 |
| 8075 if (FLAG_trace_element_transitions) { | |
| 8076 PrintElementsTransition(stdout, elements_kind, old_elements_raw, | |
| 8077 FAST_ELEMENTS, new_elements); | |
| 8078 } | |
| 8079 | |
| 8017 // Update the length if necessary. | 8080 // Update the length if necessary. |
| 8018 if (IsJSArray()) { | 8081 if (IsJSArray()) { |
| 8019 JSArray::cast(this)->set_length(Smi::FromInt(length)); | 8082 JSArray::cast(this)->set_length(Smi::FromInt(length)); |
| 8020 } | 8083 } |
| 8021 | 8084 |
| 8022 return new_elements; | 8085 return new_elements; |
| 8023 } | 8086 } |
| 8024 | 8087 |
| 8025 | 8088 |
| 8026 MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( | 8089 MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( |
| 8027 int capacity, | 8090 int capacity, |
| 8028 int length) { | 8091 int length) { |
| 8029 Heap* heap = GetHeap(); | 8092 Heap* heap = GetHeap(); |
| 8030 // We should never end in here with a pixel or external array. | 8093 // We should never end in here with a pixel or external array. |
| 8031 ASSERT(!HasExternalArrayElements()); | 8094 ASSERT(!HasExternalArrayElements()); |
| 8032 | 8095 |
| 8033 Object* obj; | 8096 Object* obj; |
| 8034 { MaybeObject* maybe_obj = | 8097 { MaybeObject* maybe_obj = |
| 8035 heap->AllocateUninitializedFixedDoubleArray(capacity); | 8098 heap->AllocateUninitializedFixedDoubleArray(capacity); |
| 8036 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 8099 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 8037 } | 8100 } |
| 8038 FixedDoubleArray* elems = FixedDoubleArray::cast(obj); | 8101 FixedDoubleArray* elems = FixedDoubleArray::cast(obj); |
| 8039 | 8102 |
| 8040 { MaybeObject* maybe_obj = | 8103 { MaybeObject* maybe_obj = |
| 8041 GetElementsTransitionMap(FAST_DOUBLE_ELEMENTS); | 8104 GetElementsTransitionMap(FAST_DOUBLE_ELEMENTS); |
| 8042 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 8105 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 8043 } | 8106 } |
| 8044 Map* new_map = Map::cast(obj); | 8107 Map* new_map = Map::cast(obj); |
| 8045 | 8108 |
| 8109 FixedArrayBase* old_elements = elements(); | |
| 8110 ElementsKind elements_kind(GetElementsKind()); | |
|
Jakob Kummerow
2011/10/19 16:02:28
nit: for consistency with line 8156:
ElementsKind
| |
| 8046 AssertNoAllocation no_gc; | 8111 AssertNoAllocation no_gc; |
| 8047 switch (GetElementsKind()) { | 8112 switch (elements_kind) { |
| 8048 case FAST_SMI_ONLY_ELEMENTS: | 8113 case FAST_SMI_ONLY_ELEMENTS: |
| 8049 case FAST_ELEMENTS: { | 8114 case FAST_ELEMENTS: { |
| 8050 elems->Initialize(FixedArray::cast(elements())); | 8115 elems->Initialize(FixedArray::cast(old_elements)); |
| 8051 break; | 8116 break; |
| 8052 } | 8117 } |
| 8053 case FAST_DOUBLE_ELEMENTS: { | 8118 case FAST_DOUBLE_ELEMENTS: { |
| 8054 elems->Initialize(FixedDoubleArray::cast(elements())); | 8119 elems->Initialize(FixedDoubleArray::cast(old_elements)); |
| 8055 break; | 8120 break; |
| 8056 } | 8121 } |
| 8057 case DICTIONARY_ELEMENTS: { | 8122 case DICTIONARY_ELEMENTS: { |
| 8058 elems->Initialize(NumberDictionary::cast(elements())); | 8123 elems->Initialize(NumberDictionary::cast(old_elements)); |
| 8059 break; | 8124 break; |
| 8060 } | 8125 } |
| 8061 default: | 8126 default: |
| 8062 UNREACHABLE(); | 8127 UNREACHABLE(); |
| 8063 break; | 8128 break; |
| 8064 } | 8129 } |
| 8065 | 8130 |
| 8131 if (FLAG_trace_element_transitions) { | |
| 8132 PrintElementsTransition(stdout, elements_kind, old_elements, | |
| 8133 FAST_DOUBLE_ELEMENTS, elems); | |
| 8134 } | |
| 8135 | |
| 8066 ASSERT(new_map->has_fast_double_elements()); | 8136 ASSERT(new_map->has_fast_double_elements()); |
| 8067 set_map(new_map); | 8137 set_map(new_map); |
| 8068 ASSERT(elems->IsFixedDoubleArray()); | 8138 ASSERT(elems->IsFixedDoubleArray()); |
| 8069 set_elements(elems); | 8139 set_elements(elems); |
| 8070 | 8140 |
| 8071 if (IsJSArray()) { | 8141 if (IsJSArray()) { |
| 8072 JSArray::cast(this)->set_length(Smi::FromInt(length)); | 8142 JSArray::cast(this)->set_length(Smi::FromInt(length)); |
| 8073 } | 8143 } |
| 8074 | 8144 |
| 8075 return this; | 8145 return this; |
| 8076 } | 8146 } |
| 8077 | 8147 |
| 8078 | 8148 |
| 8079 MaybeObject* JSObject::SetSlowElements(Object* len) { | 8149 MaybeObject* JSObject::SetSlowElements(Object* len) { |
| 8080 // We should never end in here with a pixel or external array. | 8150 // We should never end in here with a pixel or external array. |
| 8081 ASSERT(!HasExternalArrayElements()); | 8151 ASSERT(!HasExternalArrayElements()); |
| 8082 | 8152 |
| 8083 uint32_t new_length = static_cast<uint32_t>(len->Number()); | 8153 uint32_t new_length = static_cast<uint32_t>(len->Number()); |
| 8084 | 8154 |
| 8085 switch (GetElementsKind()) { | 8155 FixedArrayBase* old_elements = elements(); |
| 8156 ElementsKind elements_kind = GetElementsKind(); | |
| 8157 switch (elements_kind) { | |
| 8086 case FAST_SMI_ONLY_ELEMENTS: | 8158 case FAST_SMI_ONLY_ELEMENTS: |
| 8087 case FAST_ELEMENTS: | 8159 case FAST_ELEMENTS: |
| 8088 case FAST_DOUBLE_ELEMENTS: { | 8160 case FAST_DOUBLE_ELEMENTS: { |
| 8089 // Make sure we never try to shrink dense arrays into sparse arrays. | 8161 // Make sure we never try to shrink dense arrays into sparse arrays. |
| 8090 ASSERT(static_cast<uint32_t>( | 8162 ASSERT(static_cast<uint32_t>(old_elements->length()) <= new_length); |
| 8091 FixedArrayBase::cast(elements())->length()) <= new_length); | |
| 8092 MaybeObject* result = NormalizeElements(); | 8163 MaybeObject* result = NormalizeElements(); |
| 8093 if (result->IsFailure()) return result; | 8164 if (result->IsFailure()) return result; |
| 8094 | 8165 |
| 8095 // Update length for JSArrays. | 8166 // Update length for JSArrays. |
| 8096 if (IsJSArray()) JSArray::cast(this)->set_length(len); | 8167 if (IsJSArray()) JSArray::cast(this)->set_length(len); |
| 8097 break; | 8168 break; |
| 8098 } | 8169 } |
| 8099 case DICTIONARY_ELEMENTS: { | 8170 case DICTIONARY_ELEMENTS: { |
| 8100 if (IsJSArray()) { | 8171 if (IsJSArray()) { |
| 8101 uint32_t old_length = | 8172 uint32_t old_length = |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 8113 case EXTERNAL_SHORT_ELEMENTS: | 8184 case EXTERNAL_SHORT_ELEMENTS: |
| 8114 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 8185 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 8115 case EXTERNAL_INT_ELEMENTS: | 8186 case EXTERNAL_INT_ELEMENTS: |
| 8116 case EXTERNAL_UNSIGNED_INT_ELEMENTS: | 8187 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 8117 case EXTERNAL_FLOAT_ELEMENTS: | 8188 case EXTERNAL_FLOAT_ELEMENTS: |
| 8118 case EXTERNAL_DOUBLE_ELEMENTS: | 8189 case EXTERNAL_DOUBLE_ELEMENTS: |
| 8119 case EXTERNAL_PIXEL_ELEMENTS: | 8190 case EXTERNAL_PIXEL_ELEMENTS: |
| 8120 UNREACHABLE(); | 8191 UNREACHABLE(); |
| 8121 break; | 8192 break; |
| 8122 } | 8193 } |
| 8194 | |
| 8195 if (FLAG_trace_element_transitions) { | |
| 8196 PrintElementsTransition(stdout, elements_kind, old_elements, | |
| 8197 DICTIONARY_ELEMENTS, elements()); | |
| 8198 } | |
| 8199 | |
| 8123 return this; | 8200 return this; |
| 8124 } | 8201 } |
| 8125 | 8202 |
| 8126 | 8203 |
| 8127 MaybeObject* JSArray::Initialize(int capacity) { | 8204 MaybeObject* JSArray::Initialize(int capacity) { |
| 8128 Heap* heap = GetHeap(); | 8205 Heap* heap = GetHeap(); |
| 8129 ASSERT(capacity >= 0); | 8206 ASSERT(capacity >= 0); |
| 8130 set_length(Smi::FromInt(0)); | 8207 set_length(Smi::FromInt(0)); |
| 8131 FixedArray* new_elements; | 8208 FixedArray* new_elements; |
| 8132 if (capacity == 0) { | 8209 if (capacity == 0) { |
| (...skipping 4205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12338 if (break_point_objects()->IsUndefined()) return 0; | 12415 if (break_point_objects()->IsUndefined()) return 0; |
| 12339 // Single break point. | 12416 // Single break point. |
| 12340 if (!break_point_objects()->IsFixedArray()) return 1; | 12417 if (!break_point_objects()->IsFixedArray()) return 1; |
| 12341 // Multiple break points. | 12418 // Multiple break points. |
| 12342 return FixedArray::cast(break_point_objects())->length(); | 12419 return FixedArray::cast(break_point_objects())->length(); |
| 12343 } | 12420 } |
| 12344 #endif // ENABLE_DEBUGGER_SUPPORT | 12421 #endif // ENABLE_DEBUGGER_SUPPORT |
| 12345 | 12422 |
| 12346 | 12423 |
| 12347 } } // namespace v8::internal | 12424 } } // namespace v8::internal |
| OLD | NEW |