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 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1672 kNonStrictMode)); | 1672 kNonStrictMode)); |
1673 return *value; | 1673 return *value; |
1674 } | 1674 } |
1675 | 1675 |
1676 // Set the value, but only if we're assigning the initial value to a | 1676 // Set the value, but only if we're assigning the initial value to a |
1677 // constant. For now, we determine this by checking if the | 1677 // constant. For now, we determine this by checking if the |
1678 // current value is the hole. | 1678 // current value is the hole. |
1679 // Strict mode handling not needed (const is disallowed in strict mode). | 1679 // Strict mode handling not needed (const is disallowed in strict mode). |
1680 if (lookup.IsField()) { | 1680 if (lookup.IsField()) { |
1681 FixedArray* properties = global->properties(); | 1681 FixedArray* properties = global->properties(); |
1682 int index = lookup.GetFieldIndex(); | 1682 int index = lookup.GetFieldIndex().FieldIndex(); |
1683 if (properties->get(index)->IsTheHole() || !lookup.IsReadOnly()) { | 1683 if (properties->get(index)->IsTheHole() || !lookup.IsReadOnly()) { |
1684 properties->set(index, *value); | 1684 properties->set(index, *value); |
1685 } | 1685 } |
1686 } else if (lookup.IsNormal()) { | 1686 } else if (lookup.IsNormal()) { |
1687 if (global->GetNormalizedProperty(&lookup)->IsTheHole() || | 1687 if (global->GetNormalizedProperty(&lookup)->IsTheHole() || |
1688 !lookup.IsReadOnly()) { | 1688 !lookup.IsReadOnly()) { |
1689 global->SetNormalizedProperty(&lookup, *value); | 1689 global->SetNormalizedProperty(&lookup, *value); |
1690 } | 1690 } |
1691 } else { | 1691 } else { |
1692 // Ignore re-initialization of constants that have already been | 1692 // Ignore re-initialization of constants that have already been |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 // This is the property that was introduced by the const declaration. | 1762 // This is the property that was introduced by the const declaration. |
1763 // Set it if it hasn't been set before. NOTE: We cannot use | 1763 // Set it if it hasn't been set before. NOTE: We cannot use |
1764 // GetProperty() to get the current value as it 'unholes' the value. | 1764 // GetProperty() to get the current value as it 'unholes' the value. |
1765 LookupResult lookup(isolate); | 1765 LookupResult lookup(isolate); |
1766 object->LocalLookupRealNamedProperty(*name, &lookup); | 1766 object->LocalLookupRealNamedProperty(*name, &lookup); |
1767 ASSERT(lookup.IsFound()); // the property was declared | 1767 ASSERT(lookup.IsFound()); // the property was declared |
1768 ASSERT(lookup.IsReadOnly()); // and it was declared as read-only | 1768 ASSERT(lookup.IsReadOnly()); // and it was declared as read-only |
1769 | 1769 |
1770 if (lookup.IsField()) { | 1770 if (lookup.IsField()) { |
1771 FixedArray* properties = object->properties(); | 1771 FixedArray* properties = object->properties(); |
1772 int index = lookup.GetFieldIndex(); | 1772 int index = lookup.GetFieldIndex().FieldIndex(); |
1773 if (properties->get(index)->IsTheHole()) { | 1773 if (properties->get(index)->IsTheHole()) { |
1774 properties->set(index, *value); | 1774 properties->set(index, *value); |
1775 } | 1775 } |
1776 } else if (lookup.IsNormal()) { | 1776 } else if (lookup.IsNormal()) { |
1777 if (object->GetNormalizedProperty(&lookup)->IsTheHole()) { | 1777 if (object->GetNormalizedProperty(&lookup)->IsTheHole()) { |
1778 object->SetNormalizedProperty(&lookup, *value); | 1778 object->SetNormalizedProperty(&lookup, *value); |
1779 } | 1779 } |
1780 } else { | 1780 } else { |
1781 // We should not reach here. Any real, named property should be | 1781 // We should not reach here. Any real, named property should be |
1782 // either a field or a dictionary slot. | 1782 // either a field or a dictionary slot. |
(...skipping 2286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4069 Object* value = receiver->FastPropertyAt(offset); | 4069 Object* value = receiver->FastPropertyAt(offset); |
4070 return value->IsTheHole() | 4070 return value->IsTheHole() |
4071 ? isolate->heap()->undefined_value() | 4071 ? isolate->heap()->undefined_value() |
4072 : value; | 4072 : value; |
4073 } | 4073 } |
4074 // Lookup cache miss. Perform lookup and update the cache if | 4074 // Lookup cache miss. Perform lookup and update the cache if |
4075 // appropriate. | 4075 // appropriate. |
4076 LookupResult result(isolate); | 4076 LookupResult result(isolate); |
4077 receiver->LocalLookup(key, &result); | 4077 receiver->LocalLookup(key, &result); |
4078 if (result.IsField()) { | 4078 if (result.IsField()) { |
4079 int offset = result.GetFieldIndex(); | 4079 int offset = result.GetFieldIndex().FieldIndex(); |
4080 keyed_lookup_cache->Update(receiver_map, key, offset); | 4080 keyed_lookup_cache->Update(receiver_map, key, offset); |
4081 return receiver->FastPropertyAt(offset); | 4081 return receiver->FastPropertyAt(offset); |
4082 } | 4082 } |
4083 } else { | 4083 } else { |
4084 // Attempt dictionary lookup. | 4084 // Attempt dictionary lookup. |
4085 StringDictionary* dictionary = receiver->property_dictionary(); | 4085 StringDictionary* dictionary = receiver->property_dictionary(); |
4086 int entry = dictionary->FindEntry(key); | 4086 int entry = dictionary->FindEntry(key); |
4087 if ((entry != StringDictionary::kNotFound) && | 4087 if ((entry != StringDictionary::kNotFound) && |
4088 (dictionary->DetailsAt(entry).type() == NORMAL)) { | 4088 (dictionary->DetailsAt(entry).type() == NORMAL)) { |
4089 Object* value = dictionary->ValueAt(entry); | 4089 Object* value = dictionary->ValueAt(entry); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4243 ASSERT(args.length() == 2); | 4243 ASSERT(args.length() == 2); |
4244 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 4244 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
4245 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); | 4245 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); |
4246 LookupResult lookup(isolate); | 4246 LookupResult lookup(isolate); |
4247 object->LookupRealNamedProperty(*key, &lookup); | 4247 object->LookupRealNamedProperty(*key, &lookup); |
4248 if (!lookup.IsFound()) return isolate->heap()->undefined_value(); | 4248 if (!lookup.IsFound()) return isolate->heap()->undefined_value(); |
4249 switch (lookup.type()) { | 4249 switch (lookup.type()) { |
4250 case NORMAL: | 4250 case NORMAL: |
4251 return lookup.holder()->GetNormalizedProperty(&lookup); | 4251 return lookup.holder()->GetNormalizedProperty(&lookup); |
4252 case FIELD: | 4252 case FIELD: |
4253 return lookup.holder()->FastPropertyAt(lookup.GetFieldIndex()); | 4253 return lookup.holder()->FastPropertyAt( |
| 4254 lookup.GetFieldIndex().FieldIndex()); |
4254 case CONSTANT_FUNCTION: | 4255 case CONSTANT_FUNCTION: |
4255 return lookup.GetConstantFunction(); | 4256 return lookup.GetConstantFunction(); |
4256 case CALLBACKS: | 4257 case CALLBACKS: |
4257 case HANDLER: | 4258 case HANDLER: |
4258 case INTERCEPTOR: | 4259 case INTERCEPTOR: |
4259 case TRANSITION: | 4260 case TRANSITION: |
4260 return isolate->heap()->undefined_value(); | 4261 return isolate->heap()->undefined_value(); |
4261 case NONEXISTENT: | 4262 case NONEXISTENT: |
4262 UNREACHABLE(); | 4263 UNREACHABLE(); |
4263 } | 4264 } |
(...skipping 5739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10003 Object* value; | 10004 Object* value; |
10004 switch (result->type()) { | 10005 switch (result->type()) { |
10005 case NORMAL: | 10006 case NORMAL: |
10006 value = result->holder()->GetNormalizedProperty(result); | 10007 value = result->holder()->GetNormalizedProperty(result); |
10007 if (value->IsTheHole()) { | 10008 if (value->IsTheHole()) { |
10008 return heap->undefined_value(); | 10009 return heap->undefined_value(); |
10009 } | 10010 } |
10010 return value; | 10011 return value; |
10011 case FIELD: | 10012 case FIELD: |
10012 value = | 10013 value = |
10013 JSObject::cast( | 10014 JSObject::cast(result->holder())->FastPropertyAt( |
10014 result->holder())->FastPropertyAt(result->GetFieldIndex()); | 10015 result->GetFieldIndex().FieldIndex()); |
10015 if (value->IsTheHole()) { | 10016 if (value->IsTheHole()) { |
10016 return heap->undefined_value(); | 10017 return heap->undefined_value(); |
10017 } | 10018 } |
10018 return value; | 10019 return value; |
10019 case CONSTANT_FUNCTION: | 10020 case CONSTANT_FUNCTION: |
10020 return result->GetConstantFunction(); | 10021 return result->GetConstantFunction(); |
10021 case CALLBACKS: { | 10022 case CALLBACKS: { |
10022 Object* structure = result->GetCallbackObject(); | 10023 Object* structure = result->GetCallbackObject(); |
10023 if (structure->IsForeign() || structure->IsAccessorInfo()) { | 10024 if (structure->IsForeign() || structure->IsAccessorInfo()) { |
10024 MaybeObject* maybe_value = result->holder()->GetPropertyWithCallback( | 10025 MaybeObject* maybe_value = result->holder()->GetPropertyWithCallback( |
(...skipping 3291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13316 // Handle last resort GC and make sure to allow future allocations | 13317 // Handle last resort GC and make sure to allow future allocations |
13317 // to grow the heap without causing GCs (if possible). | 13318 // to grow the heap without causing GCs (if possible). |
13318 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13319 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13319 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13320 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13320 "Runtime::PerformGC"); | 13321 "Runtime::PerformGC"); |
13321 } | 13322 } |
13322 } | 13323 } |
13323 | 13324 |
13324 | 13325 |
13325 } } // namespace v8::internal | 13326 } } // namespace v8::internal |
OLD | NEW |