OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 13252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13263 | 13263 |
13264 // Compute the length of the instance descriptor. | 13264 // Compute the length of the instance descriptor. |
13265 int capacity = Capacity(); | 13265 int capacity = Capacity(); |
13266 for (int i = 0; i < capacity; i++) { | 13266 for (int i = 0; i < capacity; i++) { |
13267 Object* k = KeyAt(i); | 13267 Object* k = KeyAt(i); |
13268 if (IsKey(k)) { | 13268 if (IsKey(k)) { |
13269 Object* value = ValueAt(i); | 13269 Object* value = ValueAt(i); |
13270 PropertyType type = DetailsAt(i).type(); | 13270 PropertyType type = DetailsAt(i).type(); |
13271 ASSERT(type != FIELD); | 13271 ASSERT(type != FIELD); |
13272 instance_descriptor_length++; | 13272 instance_descriptor_length++; |
13273 if (type == NORMAL && | 13273 if (type == NORMAL && !value->IsJSFunction()) { |
13274 (!value->IsJSFunction() || heap->InNewSpace(value))) { | |
13275 number_of_fields += 1; | 13274 number_of_fields += 1; |
13276 } | 13275 } |
13277 } | 13276 } |
13278 } | 13277 } |
13279 | 13278 |
13280 int inobject_props = obj->map()->inobject_properties(); | 13279 int inobject_props = obj->map()->inobject_properties(); |
13281 | 13280 |
13282 // Allocate new map. | 13281 // Allocate new map. |
13283 Map* new_map; | 13282 Map* new_map; |
13284 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); | 13283 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13329 // Ensure the key is a symbol before writing into the instance descriptor. | 13328 // Ensure the key is a symbol before writing into the instance descriptor. |
13330 String* key; | 13329 String* key; |
13331 MaybeObject* maybe_key = heap->LookupSymbol(String::cast(k)); | 13330 MaybeObject* maybe_key = heap->LookupSymbol(String::cast(k)); |
13332 if (!maybe_key->To(&key)) return maybe_key; | 13331 if (!maybe_key->To(&key)) return maybe_key; |
13333 | 13332 |
13334 PropertyDetails details = DetailsAt(i); | 13333 PropertyDetails details = DetailsAt(i); |
13335 ASSERT(details.descriptor_index() == details.dictionary_index()); | 13334 ASSERT(details.descriptor_index() == details.dictionary_index()); |
13336 int enumeration_index = details.descriptor_index(); | 13335 int enumeration_index = details.descriptor_index(); |
13337 PropertyType type = details.type(); | 13336 PropertyType type = details.type(); |
13338 | 13337 |
13339 if (value->IsJSFunction() && !heap->InNewSpace(value)) { | 13338 if (value->IsJSFunction()) { |
13340 ConstantFunctionDescriptor d(key, | 13339 ConstantFunctionDescriptor d(key, |
13341 JSFunction::cast(value), | 13340 JSFunction::cast(value), |
13342 details.attributes(), | 13341 details.attributes(), |
13343 enumeration_index); | 13342 enumeration_index); |
13344 descriptors->Set(enumeration_index - 1, &d, witness); | 13343 descriptors->Set(enumeration_index - 1, &d, witness); |
13345 } else if (type == NORMAL) { | 13344 } else if (type == NORMAL) { |
13346 if (current_offset < inobject_props) { | 13345 if (current_offset < inobject_props) { |
13347 obj->InObjectPropertyAtPut(current_offset, | 13346 obj->InObjectPropertyAtPut(current_offset, |
13348 value, | 13347 value, |
13349 UPDATE_WRITE_BARRIER); | 13348 UPDATE_WRITE_BARRIER); |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13884 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13883 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
13885 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13884 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
13886 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13885 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
13887 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13886 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
13888 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13887 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
13889 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13888 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
13890 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13889 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
13891 } | 13890 } |
13892 | 13891 |
13893 } } // namespace v8::internal | 13892 } } // namespace v8::internal |
OLD | NEW |