Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2605)

Side by Side Diff: src/objects.cc

Issue 10909029: Clear descriptor pointer when normalizing properties. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3278 matching lines...) Expand 10 before | Expand all | Expand 10 after
3289 NORMAL, 3289 NORMAL,
3290 details.descriptor_index()); 3290 details.descriptor_index());
3291 Object* value = FastPropertyAt(descs->GetFieldIndex(i)); 3291 Object* value = FastPropertyAt(descs->GetFieldIndex(i));
3292 MaybeObject* maybe_dictionary = 3292 MaybeObject* maybe_dictionary =
3293 dictionary->Add(descs->GetKey(i), value, d); 3293 dictionary->Add(descs->GetKey(i), value, d);
3294 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; 3294 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary;
3295 break; 3295 break;
3296 } 3296 }
3297 case CALLBACKS: { 3297 case CALLBACKS: {
3298 Object* value = descs->GetCallbacksObject(i); 3298 Object* value = descs->GetCallbacksObject(i);
3299 details = details.set_pointer(0);
3299 MaybeObject* maybe_dictionary = 3300 MaybeObject* maybe_dictionary =
3300 dictionary->Add(descs->GetKey(i), value, details); 3301 dictionary->Add(descs->GetKey(i), value, details);
3301 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; 3302 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary;
3302 break; 3303 break;
3303 } 3304 }
3304 case INTERCEPTOR: 3305 case INTERCEPTOR:
3305 break; 3306 break;
3306 case HANDLER: 3307 case HANDLER:
3307 case NORMAL: 3308 case NORMAL:
3308 case TRANSITION: 3309 case TRANSITION:
(...skipping 8959 matching lines...) Expand 10 before | Expand all | Expand 10 after
12268 12269
12269 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, 12270 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details,
12270 Dictionary<Shape, Key>::Hash(key)); 12271 Dictionary<Shape, Key>::Hash(key));
12271 } 12272 }
12272 12273
12273 12274
12274 template<typename Shape, typename Key> 12275 template<typename Shape, typename Key>
12275 MaybeObject* Dictionary<Shape, Key>::Add(Key key, 12276 MaybeObject* Dictionary<Shape, Key>::Add(Key key,
12276 Object* value, 12277 Object* value,
12277 PropertyDetails details) { 12278 PropertyDetails details) {
12279 ASSERT(details.dictionary_index() == details.descriptor_index());
12280
12278 // Valdate key is absent. 12281 // Valdate key is absent.
12279 SLOW_ASSERT((this->FindEntry(key) == Dictionary<Shape, Key>::kNotFound)); 12282 SLOW_ASSERT((this->FindEntry(key) == Dictionary<Shape, Key>::kNotFound));
12280 // Check whether the dictionary should be extended. 12283 // Check whether the dictionary should be extended.
12281 Object* obj; 12284 Object* obj;
12282 { MaybeObject* maybe_obj = EnsureCapacity(1, key); 12285 { MaybeObject* maybe_obj = EnsureCapacity(1, key);
12283 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 12286 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
12284 } 12287 }
12285 12288
12286 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, 12289 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details,
12287 Dictionary<Shape, Key>::Hash(key)); 12290 Dictionary<Shape, Key>::Hash(key));
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
12605 for (int i = 0; i < capacity; i++) { 12608 for (int i = 0; i < capacity; i++) {
12606 Object* k = KeyAt(i); 12609 Object* k = KeyAt(i);
12607 if (IsKey(k)) { 12610 if (IsKey(k)) {
12608 Object* value = ValueAt(i); 12611 Object* value = ValueAt(i);
12609 // Ensure the key is a symbol before writing into the instance descriptor. 12612 // Ensure the key is a symbol before writing into the instance descriptor.
12610 String* key; 12613 String* key;
12611 MaybeObject* maybe_key = heap->LookupSymbol(String::cast(k)); 12614 MaybeObject* maybe_key = heap->LookupSymbol(String::cast(k));
12612 if (!maybe_key->To(&key)) return maybe_key; 12615 if (!maybe_key->To(&key)) return maybe_key;
12613 12616
12614 PropertyDetails details = DetailsAt(i); 12617 PropertyDetails details = DetailsAt(i);
12615 int enumeration_index = details.dictionary_index(); 12618 ASSERT(details.descriptor_index() == details.dictionary_index());
12619 int enumeration_index = details.descriptor_index();
12616 PropertyType type = details.type(); 12620 PropertyType type = details.type();
12617 12621
12618 if (value->IsJSFunction() && !heap->InNewSpace(value)) { 12622 if (value->IsJSFunction() && !heap->InNewSpace(value)) {
12619 ConstantFunctionDescriptor d(key, 12623 ConstantFunctionDescriptor d(key,
12620 JSFunction::cast(value), 12624 JSFunction::cast(value),
12621 details.attributes(), 12625 details.attributes(),
12622 enumeration_index); 12626 enumeration_index);
12623 descriptors->Set(enumeration_index - 1, &d, witness); 12627 descriptors->Set(enumeration_index - 1, &d, witness);
12624 } else if (type == NORMAL) { 12628 } else if (type == NORMAL) {
12625 if (current_offset < inobject_props) { 12629 if (current_offset < inobject_props) {
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
13164 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13168 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13165 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13169 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13166 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13170 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13167 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13171 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13168 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13172 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13169 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13173 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13170 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13174 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13171 } 13175 }
13172 13176
13173 } } // namespace v8::internal 13177 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698