OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 3082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3093 // Attempt to use lookup cache. | 3093 // Attempt to use lookup cache. |
3094 Map* receiver_map = receiver->map(); | 3094 Map* receiver_map = receiver->map(); |
3095 int offset = KeyedLookupCache::Lookup(receiver_map, key); | 3095 int offset = KeyedLookupCache::Lookup(receiver_map, key); |
3096 if (offset != -1) { | 3096 if (offset != -1) { |
3097 Object* value = receiver->FastPropertyAt(offset); | 3097 Object* value = receiver->FastPropertyAt(offset); |
3098 return value->IsTheHole() ? Heap::undefined_value() : value; | 3098 return value->IsTheHole() ? Heap::undefined_value() : value; |
3099 } | 3099 } |
3100 // Lookup cache miss. Perform lookup and update the cache if appropriate. | 3100 // Lookup cache miss. Perform lookup and update the cache if appropriate. |
3101 LookupResult result; | 3101 LookupResult result; |
3102 receiver->LocalLookup(key, &result); | 3102 receiver->LocalLookup(key, &result); |
3103 if (result.IsProperty() && result.IsLoaded() && result.type() == FIELD) { | 3103 if (result.IsProperty() && result.type() == FIELD) { |
3104 int offset = result.GetFieldIndex(); | 3104 int offset = result.GetFieldIndex(); |
3105 KeyedLookupCache::Update(receiver_map, key, offset); | 3105 KeyedLookupCache::Update(receiver_map, key, offset); |
3106 return receiver->FastPropertyAt(offset); | 3106 return receiver->FastPropertyAt(offset); |
3107 } | 3107 } |
3108 } else { | 3108 } else { |
3109 // Attempt dictionary lookup. | 3109 // Attempt dictionary lookup. |
3110 StringDictionary* dictionary = receiver->property_dictionary(); | 3110 StringDictionary* dictionary = receiver->property_dictionary(); |
3111 int entry = dictionary->FindEntry(key); | 3111 int entry = dictionary->FindEntry(key); |
3112 if ((entry != StringDictionary::kNotFound) && | 3112 if ((entry != StringDictionary::kNotFound) && |
3113 (dictionary->DetailsAt(entry).type() == NORMAL)) { | 3113 (dictionary->DetailsAt(entry).type() == NORMAL)) { |
(...skipping 6311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9425 } else { | 9425 } else { |
9426 // Handle last resort GC and make sure to allow future allocations | 9426 // Handle last resort GC and make sure to allow future allocations |
9427 // to grow the heap without causing GCs (if possible). | 9427 // to grow the heap without causing GCs (if possible). |
9428 Counters::gc_last_resort_from_js.Increment(); | 9428 Counters::gc_last_resort_from_js.Increment(); |
9429 Heap::CollectAllGarbage(false); | 9429 Heap::CollectAllGarbage(false); |
9430 } | 9430 } |
9431 } | 9431 } |
9432 | 9432 |
9433 | 9433 |
9434 } } // namespace v8::internal | 9434 } } // namespace v8::internal |
OLD | NEW |