Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 26 matching lines...) Expand all Loading... | |
| 37 | 37 |
| 38 #include "objects.h" | 38 #include "objects.h" |
| 39 #include "contexts.h" | 39 #include "contexts.h" |
| 40 #include "conversions-inl.h" | 40 #include "conversions-inl.h" |
| 41 #include "heap.h" | 41 #include "heap.h" |
| 42 #include "memory.h" | 42 #include "memory.h" |
| 43 #include "property.h" | 43 #include "property.h" |
| 44 #include "spaces.h" | 44 #include "spaces.h" |
| 45 #include "store-buffer.h" | 45 #include "store-buffer.h" |
| 46 | 46 |
| 47 #include "incremental-marking.h" | |
| 48 | |
| 47 namespace v8 { | 49 namespace v8 { |
| 48 namespace internal { | 50 namespace internal { |
| 49 | 51 |
| 50 PropertyDetails::PropertyDetails(Smi* smi) { | 52 PropertyDetails::PropertyDetails(Smi* smi) { |
| 51 value_ = smi->value(); | 53 value_ = smi->value(); |
| 52 } | 54 } |
| 53 | 55 |
| 54 | 56 |
| 55 Smi* PropertyDetails::AsSmi() { | 57 Smi* PropertyDetails::AsSmi() { |
| 56 return Smi::FromInt(value_); | 58 return Smi::FromInt(value_); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 72 | 74 |
| 73 #define INT_ACCESSORS(holder, name, offset) \ | 75 #define INT_ACCESSORS(holder, name, offset) \ |
| 74 int holder::name() { return READ_INT_FIELD(this, offset); } \ | 76 int holder::name() { return READ_INT_FIELD(this, offset); } \ |
| 75 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); } | 77 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); } |
| 76 | 78 |
| 77 | 79 |
| 78 #define ACCESSORS(holder, name, type, offset) \ | 80 #define ACCESSORS(holder, name, type, offset) \ |
| 79 type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \ | 81 type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \ |
| 80 void holder::set_##name(type* value, WriteBarrierMode mode) { \ | 82 void holder::set_##name(type* value, WriteBarrierMode mode) { \ |
| 81 WRITE_FIELD(this, offset, value); \ | 83 WRITE_FIELD(this, offset, value); \ |
| 82 CONDITIONAL_WRITE_BARRIER(this, offset, mode); \ | 84 WRITE_BARRIER(this, offset, value); \ |
|
Erik Corry
2011/02/22 12:27:19
Indentation of backslashes is now wrong.
Vyacheslav Egorov (Chromium)
2011/02/23 14:31:46
Done.
| |
| 83 } | 85 } |
| 84 | 86 |
| 85 | 87 |
| 86 #define SMI_ACCESSORS(holder, name, offset) \ | 88 #define SMI_ACCESSORS(holder, name, offset) \ |
| 87 int holder::name() { \ | 89 int holder::name() { \ |
| 88 Object* value = READ_FIELD(this, offset); \ | 90 Object* value = READ_FIELD(this, offset); \ |
| 89 return Smi::cast(value)->value(); \ | 91 return Smi::cast(value)->value(); \ |
| 90 } \ | 92 } \ |
| 91 void holder::set_##name(int value) { \ | 93 void holder::set_##name(int value) { \ |
| 92 WRITE_FIELD(this, offset, Smi::FromInt(value)); \ | 94 WRITE_FIELD(this, offset, Smi::FromInt(value)); \ |
| (...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 796 | 798 |
| 797 #define FIELD_ADDR(p, offset) \ | 799 #define FIELD_ADDR(p, offset) \ |
| 798 (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) | 800 (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) |
| 799 | 801 |
| 800 #define READ_FIELD(p, offset) \ | 802 #define READ_FIELD(p, offset) \ |
| 801 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset))) | 803 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset))) |
| 802 | 804 |
| 803 #define WRITE_FIELD(p, offset, value) \ | 805 #define WRITE_FIELD(p, offset, value) \ |
| 804 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) | 806 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) |
| 805 | 807 |
| 806 | 808 #define WRITE_BARRIER(object, offset, value) \ |
| 807 #define WRITE_BARRIER(object, offset) \ | 809 IncrementalMarking::RecordWrite(object, value); \ |
| 808 Heap::RecordWrite(object->address(), offset); | 810 Heap::RecordWrite(object->address(), offset); |
| 809 | 811 |
| 810 // CONDITIONAL_WRITE_BARRIER must be issued after the actual | |
| 811 // write due to the assert validating the written value. | |
| 812 #define CONDITIONAL_WRITE_BARRIER(object, offset, mode) \ | |
| 813 if (mode == UPDATE_WRITE_BARRIER) { \ | |
| 814 Heap::RecordWrite(object->address(), offset); \ | |
| 815 } else { \ | |
| 816 ASSERT(mode == SKIP_WRITE_BARRIER); \ | |
| 817 ASSERT(Heap::InNewSpace(object) || \ | |
| 818 !Heap::InNewSpace(READ_FIELD(object, offset)) || \ | |
| 819 StoreBuffer::CellIsInStoreBuffer(object->address() + offset)); \ | |
| 820 } | |
| 821 | |
| 822 #define READ_DOUBLE_FIELD(p, offset) \ | 812 #define READ_DOUBLE_FIELD(p, offset) \ |
| 823 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) | 813 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) |
| 824 | 814 |
| 825 #define WRITE_DOUBLE_FIELD(p, offset, value) \ | 815 #define WRITE_DOUBLE_FIELD(p, offset, value) \ |
| 826 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value) | 816 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value) |
| 827 | 817 |
| 828 #define READ_INT_FIELD(p, offset) \ | 818 #define READ_INT_FIELD(p, offset) \ |
| 829 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset))) | 819 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset))) |
| 830 | 820 |
| 831 #define WRITE_INT_FIELD(p, offset, value) \ | 821 #define WRITE_INT_FIELD(p, offset, value) \ |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1009 #endif | 999 #endif |
| 1010 | 1000 |
| 1011 | 1001 |
| 1012 Map* HeapObject::map() { | 1002 Map* HeapObject::map() { |
| 1013 return map_word().ToMap(); | 1003 return map_word().ToMap(); |
| 1014 } | 1004 } |
| 1015 | 1005 |
| 1016 | 1006 |
| 1017 void HeapObject::set_map(Map* value) { | 1007 void HeapObject::set_map(Map* value) { |
| 1018 set_map_word(MapWord::FromMap(value)); | 1008 set_map_word(MapWord::FromMap(value)); |
| 1009 IncrementalMarking::RecordWrite(this, value); | |
| 1019 } | 1010 } |
| 1020 | 1011 |
| 1021 | 1012 |
| 1022 MapWord HeapObject::map_word() { | 1013 MapWord HeapObject::map_word() { |
| 1023 return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset))); | 1014 return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset))); |
| 1024 } | 1015 } |
| 1025 | 1016 |
| 1026 | 1017 |
| 1027 void HeapObject::set_map_word(MapWord map_word) { | 1018 void HeapObject::set_map_word(MapWord map_word) { |
| 1028 // WRITE_FIELD does not invoke write barrier, but there is no need | 1019 // WRITE_FIELD does not invoke write barrier, but there is no need |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1092 | 1083 |
| 1093 | 1084 |
| 1094 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { | 1085 void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { |
| 1095 ASSERT(map()->has_fast_elements() == | 1086 ASSERT(map()->has_fast_elements() == |
| 1096 (value->map() == Heap::fixed_array_map() || | 1087 (value->map() == Heap::fixed_array_map() || |
| 1097 value->map() == Heap::fixed_cow_array_map())); | 1088 value->map() == Heap::fixed_cow_array_map())); |
| 1098 // In the assert below Dictionary is covered under FixedArray. | 1089 // In the assert below Dictionary is covered under FixedArray. |
| 1099 ASSERT(value->IsFixedArray() || value->IsPixelArray() || | 1090 ASSERT(value->IsFixedArray() || value->IsPixelArray() || |
| 1100 value->IsExternalArray()); | 1091 value->IsExternalArray()); |
| 1101 WRITE_FIELD(this, kElementsOffset, value); | 1092 WRITE_FIELD(this, kElementsOffset, value); |
| 1102 CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); | 1093 WRITE_BARRIER(this, kElementsOffset, value); |
| 1103 } | 1094 } |
| 1104 | 1095 |
| 1105 | 1096 |
| 1106 void JSObject::initialize_properties() { | 1097 void JSObject::initialize_properties() { |
| 1107 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); | 1098 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
| 1108 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); | 1099 WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); |
| 1109 } | 1100 } |
| 1110 | 1101 |
| 1111 | 1102 |
| 1112 void JSObject::initialize_elements() { | 1103 void JSObject::initialize_elements() { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1133 | 1124 |
| 1134 Object* JSGlobalPropertyCell::value() { | 1125 Object* JSGlobalPropertyCell::value() { |
| 1135 return READ_FIELD(this, kValueOffset); | 1126 return READ_FIELD(this, kValueOffset); |
| 1136 } | 1127 } |
| 1137 | 1128 |
| 1138 | 1129 |
| 1139 void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) { | 1130 void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) { |
| 1140 // The write barrier is not used for global property cells. | 1131 // The write barrier is not used for global property cells. |
| 1141 ASSERT(!val->IsJSGlobalPropertyCell()); | 1132 ASSERT(!val->IsJSGlobalPropertyCell()); |
| 1142 WRITE_FIELD(this, kValueOffset, val); | 1133 WRITE_FIELD(this, kValueOffset, val); |
| 1134 IncrementalMarking::RecordWrite(this, val); | |
| 1143 } | 1135 } |
| 1144 | 1136 |
| 1145 | 1137 |
| 1146 int JSObject::GetHeaderSize() { | 1138 int JSObject::GetHeaderSize() { |
| 1147 InstanceType type = map()->instance_type(); | 1139 InstanceType type = map()->instance_type(); |
| 1148 // Check for the most common kind of JavaScript object before | 1140 // Check for the most common kind of JavaScript object before |
| 1149 // falling into the generic switch. This speeds up the internal | 1141 // falling into the generic switch. This speeds up the internal |
| 1150 // field operations considerably on average. | 1142 // field operations considerably on average. |
| 1151 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; | 1143 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; |
| 1152 switch (type) { | 1144 switch (type) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1193 } | 1185 } |
| 1194 | 1186 |
| 1195 | 1187 |
| 1196 void JSObject::SetInternalField(int index, Object* value) { | 1188 void JSObject::SetInternalField(int index, Object* value) { |
| 1197 ASSERT(index < GetInternalFieldCount() && index >= 0); | 1189 ASSERT(index < GetInternalFieldCount() && index >= 0); |
| 1198 // Internal objects do follow immediately after the header, whereas in-object | 1190 // Internal objects do follow immediately after the header, whereas in-object |
| 1199 // properties are at the end of the object. Therefore there is no need | 1191 // properties are at the end of the object. Therefore there is no need |
| 1200 // to adjust the index here. | 1192 // to adjust the index here. |
| 1201 int offset = GetHeaderSize() + (kPointerSize * index); | 1193 int offset = GetHeaderSize() + (kPointerSize * index); |
| 1202 WRITE_FIELD(this, offset, value); | 1194 WRITE_FIELD(this, offset, value); |
| 1203 WRITE_BARRIER(this, offset); | 1195 WRITE_BARRIER(this, offset, value); |
| 1204 } | 1196 } |
| 1205 | 1197 |
| 1206 | 1198 |
| 1207 // Access fast-case object properties at index. The use of these routines | 1199 // Access fast-case object properties at index. The use of these routines |
| 1208 // is needed to correctly distinguish between properties stored in-object and | 1200 // is needed to correctly distinguish between properties stored in-object and |
| 1209 // properties stored in the properties array. | 1201 // properties stored in the properties array. |
| 1210 Object* JSObject::FastPropertyAt(int index) { | 1202 Object* JSObject::FastPropertyAt(int index) { |
| 1211 // Adjust for the number of properties stored in the object. | 1203 // Adjust for the number of properties stored in the object. |
| 1212 index -= map()->inobject_properties(); | 1204 index -= map()->inobject_properties(); |
| 1213 if (index < 0) { | 1205 if (index < 0) { |
| 1214 int offset = map()->instance_size() + (index * kPointerSize); | 1206 int offset = map()->instance_size() + (index * kPointerSize); |
| 1215 return READ_FIELD(this, offset); | 1207 return READ_FIELD(this, offset); |
| 1216 } else { | 1208 } else { |
| 1217 ASSERT(index < properties()->length()); | 1209 ASSERT(index < properties()->length()); |
| 1218 return properties()->get(index); | 1210 return properties()->get(index); |
| 1219 } | 1211 } |
| 1220 } | 1212 } |
| 1221 | 1213 |
| 1222 | 1214 |
| 1223 Object* JSObject::FastPropertyAtPut(int index, Object* value) { | 1215 Object* JSObject::FastPropertyAtPut(int index, Object* value) { |
| 1224 // Adjust for the number of properties stored in the object. | 1216 // Adjust for the number of properties stored in the object. |
| 1225 index -= map()->inobject_properties(); | 1217 index -= map()->inobject_properties(); |
| 1226 if (index < 0) { | 1218 if (index < 0) { |
| 1227 int offset = map()->instance_size() + (index * kPointerSize); | 1219 int offset = map()->instance_size() + (index * kPointerSize); |
| 1228 WRITE_FIELD(this, offset, value); | 1220 WRITE_FIELD(this, offset, value); |
| 1229 WRITE_BARRIER(this, offset); | 1221 WRITE_BARRIER(this, offset, value); |
| 1230 } else { | 1222 } else { |
| 1231 ASSERT(index < properties()->length()); | 1223 ASSERT(index < properties()->length()); |
| 1232 properties()->set(index, value); | 1224 properties()->set(index, value); |
| 1233 } | 1225 } |
| 1234 return value; | 1226 return value; |
| 1235 } | 1227 } |
| 1236 | 1228 |
| 1237 | 1229 |
| 1238 Object* JSObject::InObjectPropertyAt(int index) { | 1230 Object* JSObject::InObjectPropertyAt(int index) { |
| 1239 // Adjust for the number of properties stored in the object. | 1231 // Adjust for the number of properties stored in the object. |
| 1240 index -= map()->inobject_properties(); | 1232 index -= map()->inobject_properties(); |
| 1241 ASSERT(index < 0); | 1233 ASSERT(index < 0); |
| 1242 int offset = map()->instance_size() + (index * kPointerSize); | 1234 int offset = map()->instance_size() + (index * kPointerSize); |
| 1243 return READ_FIELD(this, offset); | 1235 return READ_FIELD(this, offset); |
| 1244 } | 1236 } |
| 1245 | 1237 |
| 1246 | 1238 |
| 1247 Object* JSObject::InObjectPropertyAtPut(int index, | 1239 Object* JSObject::InObjectPropertyAtPut(int index, |
| 1248 Object* value, | 1240 Object* value, |
| 1249 WriteBarrierMode mode) { | 1241 WriteBarrierMode mode) { |
| 1250 // Adjust for the number of properties stored in the object. | 1242 // Adjust for the number of properties stored in the object. |
| 1251 index -= map()->inobject_properties(); | 1243 index -= map()->inobject_properties(); |
| 1252 ASSERT(index < 0); | 1244 ASSERT(index < 0); |
| 1253 int offset = map()->instance_size() + (index * kPointerSize); | 1245 int offset = map()->instance_size() + (index * kPointerSize); |
| 1254 WRITE_FIELD(this, offset, value); | 1246 WRITE_FIELD(this, offset, value); |
| 1255 CONDITIONAL_WRITE_BARRIER(this, offset, mode); | 1247 WRITE_BARRIER(this, offset, value); |
| 1256 return value; | 1248 return value; |
| 1257 } | 1249 } |
| 1258 | 1250 |
| 1259 | 1251 |
| 1260 | 1252 |
| 1261 void JSObject::InitializeBody(int object_size, Object* value) { | 1253 void JSObject::InitializeBody(int object_size, Object* value) { |
| 1262 ASSERT(!value->IsHeapObject() || !Heap::InNewSpace(value)); | 1254 ASSERT(!value->IsHeapObject() || !Heap::InNewSpace(value)); |
| 1263 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { | 1255 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { |
| 1264 WRITE_FIELD(this, offset, value); | 1256 WRITE_FIELD(this, offset, value); |
| 1265 } | 1257 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 int offset = kHeaderSize + index * kPointerSize; | 1325 int offset = kHeaderSize + index * kPointerSize; |
| 1334 WRITE_FIELD(this, offset, value); | 1326 WRITE_FIELD(this, offset, value); |
| 1335 } | 1327 } |
| 1336 | 1328 |
| 1337 | 1329 |
| 1338 void FixedArray::set(int index, Object* value) { | 1330 void FixedArray::set(int index, Object* value) { |
| 1339 ASSERT(map() != Heap::fixed_cow_array_map()); | 1331 ASSERT(map() != Heap::fixed_cow_array_map()); |
| 1340 ASSERT(index >= 0 && index < this->length()); | 1332 ASSERT(index >= 0 && index < this->length()); |
| 1341 int offset = kHeaderSize + index * kPointerSize; | 1333 int offset = kHeaderSize + index * kPointerSize; |
| 1342 WRITE_FIELD(this, offset, value); | 1334 WRITE_FIELD(this, offset, value); |
| 1343 WRITE_BARRIER(this, offset); | 1335 WRITE_BARRIER(this, offset, value); |
| 1344 } | 1336 } |
| 1345 | 1337 |
| 1346 | 1338 |
| 1347 WriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) { | 1339 WriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) { |
| 1348 if (Heap::InNewSpace(this)) return SKIP_WRITE_BARRIER; | 1340 if (Heap::InNewSpace(this)) return SKIP_WRITE_BARRIER; |
| 1349 return UPDATE_WRITE_BARRIER; | 1341 return UPDATE_WRITE_BARRIER; |
| 1350 } | 1342 } |
| 1351 | 1343 |
| 1352 | 1344 |
| 1353 void FixedArray::set(int index, | 1345 void FixedArray::set(int index, |
| 1354 Object* value, | 1346 Object* value, |
| 1355 WriteBarrierMode mode) { | 1347 WriteBarrierMode mode) { |
| 1356 ASSERT(map() != Heap::fixed_cow_array_map()); | 1348 ASSERT(map() != Heap::fixed_cow_array_map()); |
| 1357 ASSERT(index >= 0 && index < this->length()); | 1349 ASSERT(index >= 0 && index < this->length()); |
| 1358 int offset = kHeaderSize + index * kPointerSize; | 1350 int offset = kHeaderSize + index * kPointerSize; |
| 1359 WRITE_FIELD(this, offset, value); | 1351 WRITE_FIELD(this, offset, value); |
| 1360 CONDITIONAL_WRITE_BARRIER(this, offset, mode); | 1352 WRITE_BARRIER(this, offset, value); |
| 1361 } | 1353 } |
| 1362 | 1354 |
| 1363 | 1355 |
| 1364 void FixedArray::fast_set(FixedArray* array, int index, Object* value) { | 1356 void FixedArray::fast_set(FixedArray* array, int index, Object* value) { |
| 1365 ASSERT(array->map() != Heap::raw_unchecked_fixed_cow_array_map()); | 1357 ASSERT(array->map() != Heap::raw_unchecked_fixed_cow_array_map()); |
| 1366 ASSERT(index >= 0 && index < array->length()); | 1358 ASSERT(index >= 0 && index < array->length()); |
| 1367 ASSERT(!Heap::InNewSpace(value)); | 1359 ASSERT(!Heap::InNewSpace(value)); |
| 1368 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); | 1360 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); |
| 1361 IncrementalMarking::RecordWrite(array, value); | |
| 1369 } | 1362 } |
| 1370 | 1363 |
| 1371 | 1364 |
| 1372 void FixedArray::set_undefined(int index) { | 1365 void FixedArray::set_undefined(int index) { |
| 1373 ASSERT(map() != Heap::fixed_cow_array_map()); | 1366 ASSERT(map() != Heap::fixed_cow_array_map()); |
| 1374 ASSERT(index >= 0 && index < this->length()); | 1367 ASSERT(index >= 0 && index < this->length()); |
| 1375 ASSERT(!Heap::InNewSpace(Heap::undefined_value())); | 1368 ASSERT(!Heap::InNewSpace(Heap::undefined_value())); |
| 1376 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, | 1369 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, |
| 1377 Heap::undefined_value()); | 1370 Heap::undefined_value()); |
| 1378 } | 1371 } |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1399 int offset = kHeaderSize + index * kPointerSize; | 1392 int offset = kHeaderSize + index * kPointerSize; |
| 1400 WRITE_FIELD(this, offset, value); | 1393 WRITE_FIELD(this, offset, value); |
| 1401 } | 1394 } |
| 1402 | 1395 |
| 1403 | 1396 |
| 1404 void FixedArray::set_unchecked(int index, | 1397 void FixedArray::set_unchecked(int index, |
| 1405 Object* value, | 1398 Object* value, |
| 1406 WriteBarrierMode mode) { | 1399 WriteBarrierMode mode) { |
| 1407 int offset = kHeaderSize + index * kPointerSize; | 1400 int offset = kHeaderSize + index * kPointerSize; |
| 1408 WRITE_FIELD(this, offset, value); | 1401 WRITE_FIELD(this, offset, value); |
| 1409 CONDITIONAL_WRITE_BARRIER(this, offset, mode); | 1402 WRITE_BARRIER(this, offset, value); |
| 1410 } | 1403 } |
| 1411 | 1404 |
| 1412 | 1405 |
| 1413 void FixedArray::set_null_unchecked(int index) { | 1406 void FixedArray::set_null_unchecked(int index) { |
| 1414 ASSERT(index >= 0 && index < this->length()); | 1407 ASSERT(index >= 0 && index < this->length()); |
| 1415 ASSERT(!Heap::InNewSpace(Heap::null_value())); | 1408 ASSERT(!Heap::InNewSpace(Heap::null_value())); |
| 1416 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::null_value()); | 1409 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::null_value()); |
| 1417 } | 1410 } |
| 1418 | 1411 |
| 1419 | 1412 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1810 } | 1803 } |
| 1811 | 1804 |
| 1812 | 1805 |
| 1813 Object* ConsString::unchecked_first() { | 1806 Object* ConsString::unchecked_first() { |
| 1814 return READ_FIELD(this, kFirstOffset); | 1807 return READ_FIELD(this, kFirstOffset); |
| 1815 } | 1808 } |
| 1816 | 1809 |
| 1817 | 1810 |
| 1818 void ConsString::set_first(String* value, WriteBarrierMode mode) { | 1811 void ConsString::set_first(String* value, WriteBarrierMode mode) { |
| 1819 WRITE_FIELD(this, kFirstOffset, value); | 1812 WRITE_FIELD(this, kFirstOffset, value); |
| 1820 CONDITIONAL_WRITE_BARRIER(this, kFirstOffset, mode); | 1813 WRITE_BARRIER(this, kFirstOffset, value); |
| 1821 } | 1814 } |
| 1822 | 1815 |
| 1823 | 1816 |
| 1824 String* ConsString::second() { | 1817 String* ConsString::second() { |
| 1825 return String::cast(READ_FIELD(this, kSecondOffset)); | 1818 return String::cast(READ_FIELD(this, kSecondOffset)); |
| 1826 } | 1819 } |
| 1827 | 1820 |
| 1828 | 1821 |
| 1829 Object* ConsString::unchecked_second() { | 1822 Object* ConsString::unchecked_second() { |
| 1830 return READ_FIELD(this, kSecondOffset); | 1823 return READ_FIELD(this, kSecondOffset); |
| 1831 } | 1824 } |
| 1832 | 1825 |
| 1833 | 1826 |
| 1834 void ConsString::set_second(String* value, WriteBarrierMode mode) { | 1827 void ConsString::set_second(String* value, WriteBarrierMode mode) { |
| 1835 WRITE_FIELD(this, kSecondOffset, value); | 1828 WRITE_FIELD(this, kSecondOffset, value); |
| 1836 CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, mode); | 1829 WRITE_BARRIER(this, kSecondOffset, value); |
| 1837 } | 1830 } |
| 1838 | 1831 |
| 1839 | 1832 |
| 1840 ExternalAsciiString::Resource* ExternalAsciiString::resource() { | 1833 ExternalAsciiString::Resource* ExternalAsciiString::resource() { |
| 1841 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); | 1834 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); |
| 1842 } | 1835 } |
| 1843 | 1836 |
| 1844 | 1837 |
| 1845 void ExternalAsciiString::set_resource( | 1838 void ExternalAsciiString::set_resource( |
| 1846 ExternalAsciiString::Resource* resource) { | 1839 ExternalAsciiString::Resource* resource) { |
| (...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2586 | 2579 |
| 2587 | 2580 |
| 2588 Object* Map::prototype() { | 2581 Object* Map::prototype() { |
| 2589 return READ_FIELD(this, kPrototypeOffset); | 2582 return READ_FIELD(this, kPrototypeOffset); |
| 2590 } | 2583 } |
| 2591 | 2584 |
| 2592 | 2585 |
| 2593 void Map::set_prototype(Object* value, WriteBarrierMode mode) { | 2586 void Map::set_prototype(Object* value, WriteBarrierMode mode) { |
| 2594 ASSERT(value->IsNull() || value->IsJSObject()); | 2587 ASSERT(value->IsNull() || value->IsJSObject()); |
| 2595 WRITE_FIELD(this, kPrototypeOffset, value); | 2588 WRITE_FIELD(this, kPrototypeOffset, value); |
| 2596 CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode); | 2589 WRITE_BARRIER(this, kPrototypeOffset, value); |
| 2597 } | 2590 } |
| 2598 | 2591 |
| 2599 | 2592 |
| 2600 MaybeObject* Map::GetFastElementsMap() { | 2593 MaybeObject* Map::GetFastElementsMap() { |
| 2601 if (has_fast_elements()) return this; | 2594 if (has_fast_elements()) return this; |
| 2602 Object* obj; | 2595 Object* obj; |
| 2603 { MaybeObject* maybe_obj = CopyDropTransitions(); | 2596 { MaybeObject* maybe_obj = CopyDropTransitions(); |
| 2604 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2597 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 2605 } | 2598 } |
| 2606 Map* new_map = Map::cast(obj); | 2599 Map* new_map = Map::cast(obj); |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2936 } | 2929 } |
| 2937 | 2930 |
| 2938 | 2931 |
| 2939 Code* SharedFunctionInfo::unchecked_code() { | 2932 Code* SharedFunctionInfo::unchecked_code() { |
| 2940 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset)); | 2933 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset)); |
| 2941 } | 2934 } |
| 2942 | 2935 |
| 2943 | 2936 |
| 2944 void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { | 2937 void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { |
| 2945 WRITE_FIELD(this, kCodeOffset, value); | 2938 WRITE_FIELD(this, kCodeOffset, value); |
| 2946 CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode); | 2939 WRITE_BARRIER(this, kCodeOffset, value); |
| 2947 } | 2940 } |
| 2948 | 2941 |
| 2949 | 2942 |
| 2950 SerializedScopeInfo* SharedFunctionInfo::scope_info() { | 2943 SerializedScopeInfo* SharedFunctionInfo::scope_info() { |
| 2951 return reinterpret_cast<SerializedScopeInfo*>( | 2944 return reinterpret_cast<SerializedScopeInfo*>( |
| 2952 READ_FIELD(this, kScopeInfoOffset)); | 2945 READ_FIELD(this, kScopeInfoOffset)); |
| 2953 } | 2946 } |
| 2954 | 2947 |
| 2955 | 2948 |
| 2956 void SharedFunctionInfo::set_scope_info(SerializedScopeInfo* value, | 2949 void SharedFunctionInfo::set_scope_info(SerializedScopeInfo* value, |
| 2957 WriteBarrierMode mode) { | 2950 WriteBarrierMode mode) { |
| 2958 WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); | 2951 WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); |
| 2959 CONDITIONAL_WRITE_BARRIER(this, kScopeInfoOffset, mode); | 2952 WRITE_BARRIER(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); |
| 2960 } | 2953 } |
| 2961 | 2954 |
| 2962 | 2955 |
| 2963 Smi* SharedFunctionInfo::deopt_counter() { | 2956 Smi* SharedFunctionInfo::deopt_counter() { |
| 2964 return reinterpret_cast<Smi*>(READ_FIELD(this, kDeoptCounterOffset)); | 2957 return reinterpret_cast<Smi*>(READ_FIELD(this, kDeoptCounterOffset)); |
| 2965 } | 2958 } |
| 2966 | 2959 |
| 2967 | 2960 |
| 2968 void SharedFunctionInfo::set_deopt_counter(Smi* value) { | 2961 void SharedFunctionInfo::set_deopt_counter(Smi* value) { |
| 2969 WRITE_FIELD(this, kDeoptCounterOffset, value); | 2962 WRITE_FIELD(this, kDeoptCounterOffset, value); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3044 return reinterpret_cast<Code*>( | 3037 return reinterpret_cast<Code*>( |
| 3045 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset))); | 3038 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset))); |
| 3046 } | 3039 } |
| 3047 | 3040 |
| 3048 | 3041 |
| 3049 void JSFunction::set_code(Code* value) { | 3042 void JSFunction::set_code(Code* value) { |
| 3050 // Skip the write barrier because code is never in new space. | 3043 // Skip the write barrier because code is never in new space. |
| 3051 ASSERT(!Heap::InNewSpace(value)); | 3044 ASSERT(!Heap::InNewSpace(value)); |
| 3052 Address entry = value->entry(); | 3045 Address entry = value->entry(); |
| 3053 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); | 3046 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); |
| 3047 IncrementalMarking::RecordWrite(this, value); | |
| 3054 } | 3048 } |
| 3055 | 3049 |
| 3056 | 3050 |
| 3057 void JSFunction::ReplaceCode(Code* code) { | 3051 void JSFunction::ReplaceCode(Code* code) { |
| 3058 bool was_optimized = IsOptimized(); | 3052 bool was_optimized = IsOptimized(); |
| 3059 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION; | 3053 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION; |
| 3060 | 3054 |
| 3061 set_code(code); | 3055 set_code(code); |
| 3062 | 3056 |
| 3063 // Add/remove the function from the list of optimized functions for this | 3057 // Add/remove the function from the list of optimized functions for this |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 3083 | 3077 |
| 3084 SharedFunctionInfo* JSFunction::unchecked_shared() { | 3078 SharedFunctionInfo* JSFunction::unchecked_shared() { |
| 3085 return reinterpret_cast<SharedFunctionInfo*>( | 3079 return reinterpret_cast<SharedFunctionInfo*>( |
| 3086 READ_FIELD(this, kSharedFunctionInfoOffset)); | 3080 READ_FIELD(this, kSharedFunctionInfoOffset)); |
| 3087 } | 3081 } |
| 3088 | 3082 |
| 3089 | 3083 |
| 3090 void JSFunction::set_context(Object* value) { | 3084 void JSFunction::set_context(Object* value) { |
| 3091 ASSERT(value == Heap::undefined_value() || value->IsContext()); | 3085 ASSERT(value == Heap::undefined_value() || value->IsContext()); |
| 3092 WRITE_FIELD(this, kContextOffset, value); | 3086 WRITE_FIELD(this, kContextOffset, value); |
| 3093 WRITE_BARRIER(this, kContextOffset); | 3087 WRITE_BARRIER(this, kContextOffset, value); |
| 3094 } | 3088 } |
| 3095 | 3089 |
| 3096 ACCESSORS(JSFunction, prototype_or_initial_map, Object, | 3090 ACCESSORS(JSFunction, prototype_or_initial_map, Object, |
| 3097 kPrototypeOrInitialMapOffset) | 3091 kPrototypeOrInitialMapOffset) |
| 3098 | 3092 |
| 3099 | 3093 |
| 3100 Map* JSFunction::initial_map() { | 3094 Map* JSFunction::initial_map() { |
| 3101 return Map::cast(prototype_or_initial_map()); | 3095 return Map::cast(prototype_or_initial_map()); |
| 3102 } | 3096 } |
| 3103 | 3097 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3157 Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) { | 3151 Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) { |
| 3158 ASSERT(id < kJSBuiltinsCount); // id is unsigned. | 3152 ASSERT(id < kJSBuiltinsCount); // id is unsigned. |
| 3159 return READ_FIELD(this, OffsetOfFunctionWithId(id)); | 3153 return READ_FIELD(this, OffsetOfFunctionWithId(id)); |
| 3160 } | 3154 } |
| 3161 | 3155 |
| 3162 | 3156 |
| 3163 void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, | 3157 void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, |
| 3164 Object* value) { | 3158 Object* value) { |
| 3165 ASSERT(id < kJSBuiltinsCount); // id is unsigned. | 3159 ASSERT(id < kJSBuiltinsCount); // id is unsigned. |
| 3166 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); | 3160 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); |
| 3167 WRITE_BARRIER(this, OffsetOfFunctionWithId(id)); | 3161 WRITE_BARRIER(this, OffsetOfFunctionWithId(id), value); |
| 3168 } | 3162 } |
| 3169 | 3163 |
| 3170 | 3164 |
| 3171 Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) { | 3165 Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) { |
| 3172 ASSERT(id < kJSBuiltinsCount); // id is unsigned. | 3166 ASSERT(id < kJSBuiltinsCount); // id is unsigned. |
| 3173 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id))); | 3167 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id))); |
| 3174 } | 3168 } |
| 3175 | 3169 |
| 3176 | 3170 |
| 3177 void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, | 3171 void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, |
| (...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3789 | 3783 |
| 3790 | 3784 |
| 3791 #undef CAST_ACCESSOR | 3785 #undef CAST_ACCESSOR |
| 3792 #undef INT_ACCESSORS | 3786 #undef INT_ACCESSORS |
| 3793 #undef SMI_ACCESSORS | 3787 #undef SMI_ACCESSORS |
| 3794 #undef ACCESSORS | 3788 #undef ACCESSORS |
| 3795 #undef FIELD_ADDR | 3789 #undef FIELD_ADDR |
| 3796 #undef READ_FIELD | 3790 #undef READ_FIELD |
| 3797 #undef WRITE_FIELD | 3791 #undef WRITE_FIELD |
| 3798 #undef WRITE_BARRIER | 3792 #undef WRITE_BARRIER |
| 3799 #undef CONDITIONAL_WRITE_BARRIER | |
| 3800 #undef READ_MEMADDR_FIELD | 3793 #undef READ_MEMADDR_FIELD |
| 3801 #undef WRITE_MEMADDR_FIELD | 3794 #undef WRITE_MEMADDR_FIELD |
| 3802 #undef READ_DOUBLE_FIELD | 3795 #undef READ_DOUBLE_FIELD |
| 3803 #undef WRITE_DOUBLE_FIELD | 3796 #undef WRITE_DOUBLE_FIELD |
| 3804 #undef READ_INT_FIELD | 3797 #undef READ_INT_FIELD |
| 3805 #undef WRITE_INT_FIELD | 3798 #undef WRITE_INT_FIELD |
| 3806 #undef READ_SHORT_FIELD | 3799 #undef READ_SHORT_FIELD |
| 3807 #undef WRITE_SHORT_FIELD | 3800 #undef WRITE_SHORT_FIELD |
| 3808 #undef READ_BYTE_FIELD | 3801 #undef READ_BYTE_FIELD |
| 3809 #undef WRITE_BYTE_FIELD | 3802 #undef WRITE_BYTE_FIELD |
| 3810 | 3803 |
| 3811 | 3804 |
| 3812 } } // namespace v8::internal | 3805 } } // namespace v8::internal |
| 3813 | 3806 |
| 3814 #endif // V8_OBJECTS_INL_H_ | 3807 #endif // V8_OBJECTS_INL_H_ |
| OLD | NEW |